В этом руководстве мы рассмотрим, как правильно развернуть Python-приложение на виртуальном сервере (VDS) с использованием связки uWSGI + Nginx.
Содержание
Создайте VDS на чистом дистрибутиве debian.
Далее подключитесь к VDS по SSH (инструкция) под пользователем root.
Создайте пользователя web
с домашним каталогом /home/web
:
adduser --home /home/web --gecos "" web
После выполнения команды, введите пароль для пользователя web
. Пароль не будет отображаться на экране при его вводе.
Выдайте права администратора пользователю web
:
usermod -aG sudo web
Обновите пакеты и установите инструменты для сборки Python:
apt update
apt install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev \
python3-openssl git
Для удобства управления версиями python установим pyenv
.
Pyenv позволяет устанавливать любую версию python на ваш сервер.
Более подробно почитать о работе peynv можно по (ссылке )
Перед установкой нужно переключиться на пользователя web
.
su - web
curl https://pyenv.run | bash`
Для автоматического запуска pyenv
нужно отредактировать файл .bashrc
. Откройте файл командой:
nano ~/.bashrc
В конец файла допишите строки:
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
Чтобы применить изменения выполните команду:
source ~/.bashrc
Просмотрите доступные версии python для установки на сервер :
pyenv install --list
Установите python нужной версии (например, 3.12):
pyenv install 3.12
Установка может продлиться длительное время, так как python будет собраться под ваш VDS, поэтому нужно дождаться окончания процесса
Проверьте установленную версию:
pyenv versions
Создайте каталог, где будут хранится файлы сайта:
mkdir /home/web/sitename.ru
Вместо
sitename.ru
используйте имя вашего сайта
Перейдите в этот каталог:
cd /home/web/sitename.ru
Создайте папки app
и www
. В папке app
будут хранится исходные файлы сайта, а в папке www
будут хранится статические файлы для работы сайта.
mkdir app www
Также создайте файл .env
, в нём будут хранится переменные окружения для вашего приложения
touch .env
Теперь загрузите исходные файлы приложения в каталог /home/web/sitename.ru/app
, а в каталог /home/web/sitename.ru/www
зашрузите статические файлы сайта.
Создайте и активируйте окружение:
pyenv virtualenv 3.12 myproject-env
pyenv activate myproject-env
Установите зависимости, для работы приложения из файла requirement.txt
:
pip install -r requirement.txt
Обязательно установите библиотеку uwsgi
:
pip install uwsgi
Для выхода из виртуального окружения используйте команду:
source deactivate
Нажмите сочетание клавиш ctrl + d
, чтобы обратно переключиться на пользователя root
.
Создайте каталоги для работы uwsgi и выдайте на них права пользователю web
:
mkdir -p /etc/uwsgi /var/log/uwsgi /run/uwsgi
chown -R web:web /run/uwsgi /var/log/uwsgi
Добавьте пользователя www-data
в группу пользователя web
:
adduser www-data web
Создайте конфигурационный файл для uwsgi:
nano /etc/uwsgi/sitename_ru.ini
Пример конфигурации:
[uwsgi]
wsgi-file = /home/web/sitename.ru/app/wsgi.py
callable = application
master = true
no-orphans = true
processes = 4
threads = 2
socket = /run/uwsgi/sitename_ru.sock
pidfile = /run/uwsgi/sitename_ru.pid
chmod-socket = 660
vacuum = true
die-on-term = true
enable-threads = true
max-requests=5000
max-worker-lifetime=3600
reload-on-rss=2048
worker-reload-mercy=200
harakiri = 300
post-buffering = 8192
buffer-size = 32768
virtualenv = /home/web/.pyenv/versions/myproject-env
pythonpath = /home/web/sitename.ru/app
env-file = /home/web/sitename.ru/.env
logto = /var/log/uwsgi/sitename_ru.log
Здесь мы опишем некоторые настройки, которые нужно корректировать для запуска вашего приложения.
Переменная wsgi-file
- указывает путь до главного файла, который отвечает за запуск вашего python приложения
Переменная callable
- указывает uWSGI, какой объект в вашем Python-приложении является вызываемым. Например в Django используется параметр application
, во Flask параметр app
.
Переменная socket
- указывает путь до сокета, по которому можно обращаться к приложению
Переменная virtualenv
- указывает путь до виртуального окружения pyenv, откуда будут браться параметры для запуска приложения
Переменная pythonpath
- указывает путь до каталога с файлами сайта, чтобы python понимал, откуда нужно подгружать файлы проекта
Переменная env-file
- указывает путь до файла, откуда будут браться дополнительные переменные окружения, для работы приложения
Переменная logto
- указываем путь до файла, куда будет писаться лог работы вашего приложения
Создайте сервис в systemd, который будет отвечать за запуск python приложения:
nano /etc/systemd/system/uwsgi-sitename_ru.service
Пример конфигурации:
[Unit]
Description=uWSGI service for sitename.ru
After=network.target
[Service]
User=web
Group=web
WorkingDirectory=/home/web/sitename.ru/app
Environment="PATH=/home/web/.pyenv/versions/myproject-env/bin"
ExecStart=/home/web/.pyenv/versions/myproject-env/bin/uwsgi --ini /etc/uwsgi/sitename_ru.ini
[Install]
WantedBy=multi-user.target
Здесь мы опишем некоторые настройки, которые нужно корректировать для запуска вашего приложения.
Переменная User
и Group
- указывает от какого пользователя linux запускается приложение.
Переменная WorkingDirectory
- указывает путь до каталога с файлами сайта, что systemd понимал, в какой директории хранятся файлы приложения
Переменная Environment
- указывает путь до виртуального окружения pyenv, откуда будут браться параметры для запуска приложения
Переменная ExecStart
- указывает, какой процесс запукать, в нашем случае это процесс uwsgi, а также в переменной указывается откуда uwsgi должен брать настройки для запуска.
В нашем случае он берёт настройки из нашего кастомного конфигурационного файла sitename_ru.ini
Запустите сервис:
systemctl daemon-reload
systemctl enable uwsgi-sitename_ru
systemctl start uwsgi-sitename_ru
Установите nginx
:
apt install nginx -y
Создайте конфигурационный файл для сайта:
nano /etc/nginx/sites-available/sitename.ru.conf
Пример конфигурации:
server {
listen 80;
server_name sitename.ru;
access_log /var/log/nginx/sitename_ru.log combined;
root /home/web/sitename.ru/www;
index index.html index.htm;
location / {
try_files $uri @uwsgi;
expires 30d;
add_header Cache-Control "public";
}
location @uwsgi {
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/sitename_ru.sock;
uwsgi_param Host $host;
uwsgi_param X-Real-IP $remote_addr;
uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
uwsgi_read_timeout 120s;
uwsgi_send_timeout 120s;
uwsgi_buffer_size 128k;
uwsgi_buffers 4 256k;
uwsgi_busy_buffers_size 256k;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1000;
gzip_comp_level 5;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
}
Здесь мы опишем некоторые настройки, которые нужно корректировать для запуска вашего приложения.
Переменная server_name
- указывает по какому домену будет работать данный конфигурационный файл nginx
Переменная root
- указывает путь до каталога с файлами сайта, чтобы nginx раздавал сатические файлы, при обращении к сайту
Переменная uwsgi_pass
- указывает путь до сокета, по которому нужно общаться python приложением
Активируйте конфигурационный файл и перезапустите Nginx:
ln -s /etc/nginx/sites-available/sitename.ru.conf /etc/nginx/sites-enabled/
nginx -t
nginx -s reload
Поздравляем, ваше python приложение запущено и доступно по домену.
Данная статья также подходит для запусков python приложений на нашем дистрибутиве Netangels panel, так как он построен на дистрибутиве debian
Старт приложения делается командом:
systemctl start uwsgi-sitename_ru
Остановка приложения делается командом:
systemctl stop uwsgi-sitename_ru
Проверить статус приложения можно командой:
systemctl status uwsgi-sitename_ru
Переключаемся на пользователя web
:
su - web
Установите нужную версию python, на которую вы хотите переключить приложение (например, 3.8) :
pyenv install 3.8
Создайте и активируйте окружение:
pyenv virtualenv 3.8 myproject-new-env
pyenv activate myproject-new-env
Перейдите в папку проекта:
cd /home/web/sitename.ru/app
Установите зависимости, для работы приложения из файла requirement.txt
:
pip install -r requirement.txt
Обязательно установите библиотеку uwsgi
:
pip install uwsgi
Нажмите сочетание клавиш ctrl + d
, чтобы обратно переключиться на пользователя root
.
Откройте файл myproject.ini
nano /etc/uwsgi/myproject.ini
Поменяйте все строки myproject-env
на myproject-new-env
во всем файле.
Откройте файл uwsgi-myproject.service
nano /etc/systemd/system/uwsgi-myproject.service
Поменяйте все строки myproject-env
на myproject-new-env
во всем файле.
Перезапустите процесс приложения
systemctl daemon-reload
systemctl restart uwsgi-myproject
Поздравляем, теперь ваше приложение работает на другой версии python.