Общие вопросы
Как сбросить пароль root?Запуск образов VDS на локальном компьютереОтправка писем по SMTP на VDS с панелью NetAngelsИспользование раздела Облачные VDS в панели управленияИспользование образа с панелью управления NetAngelsСпециальные образы VDS для быстрого развертывания (LAMP)Как клонировать виртуальные машиныГостевой агентПриватная сетьКак поправить настройки sshd?Как включить защиту от DDoS через CloudflareVDS как промежуточный сервер для выхода в интернетМонтирование диска в VDSЗащита от DDoS атакИнструкция по настройке исходящего SMTP для тарифов VDS StartСервер для веб-конференций, совещаний и онлайн лекцийВосстановление отдельных файлов в виде архиваНастройка сети на VDSУстановка Windows из ISO-образа на VDSSSH-доступ к хостинг-аккаунтуКак настроить отправку почты с сайтаАвтоматизация обновления SSL-сертификата через API NetAngelsВыпуск SSL сертификата на VDS c помощью утилиты dehydratedКак подключить SSL-сертификат для сайта на облачном VDS с панелью управления NetAngelsКонсольные команды. Работа с данными.Консольные команды. Работа с MySQL, создание и загрузка дампа.Консольные команды. Анализ состояния сервера
Запуск Python-приложений с помощью uWSGI и Nginx

Запуск Python-приложений с uWSGI и Nginx на услуге VDS.

В этом руководстве мы рассмотрим, как правильно развернуть Python-приложение на виртуальном сервере (VDS) с использованием связки uWSGI + Nginx.

Содержание

  1. Подготовка сервера и настройка окружения
    1. Создание пользователя и установка зависимостей
    2. Установка зависимостей для Python
    3. Установка pyenv
    4. Установка нужной версии python через pyenv
  2. Развертывание проекта
    1. Настройка файлов проекта
    2. Настройка зависимостей
  3. Настройка uWSGI
    1. Конфигурация uWSGI
    2. Запуск uWSGI через systemd
  4. Настройка Nginx
  5. Управление python приложением
  6. Смена версии python для запущенного приложения
    1. Установка новой версии python через pyenv
    2. Корректировка настроек uWSGI для новой версии python

1. Подготовка сервера и настройка окружения

1.1 Создание пользователя для запуска приложения

Создайте VDS на чистом дистрибутиве debian.

Далее подключитесь к VDS по SSH (инструкция) под пользователем root.

Создайте пользователя web с домашним каталогом /home/web:

adduser --home /home/web --gecos "" web

После выполнения команды, введите пароль для пользователя web. Пароль не будет отображаться на экране при его вводе.

Выдайте права администратора пользователю web:

usermod -aG sudo web

1.2 Установка зависимостей для Python

Обновите пакеты и установите инструменты для сборки 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

1.3 Установка pyenv

Для удобства управления версиями 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

1.4 Установка нужной версии python через pyenv

Просмотрите доступные версии python для установки на сервер :

pyenv install --list

Установите python нужной версии (например, 3.12):

pyenv install 3.12

Установка может продлиться длительное время, так как python будет собраться под ваш VDS, поэтому нужно дождаться окончания процесса

Проверьте установленную версию:

pyenv versions

2. Развертывание проекта

2.1 Настройка файлов проекта

Создайте каталог, где будут хранится файлы сайта:

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 зашрузите статические файлы сайта.

2.2 Настройка зависимостей

Создайте и активируйте окружение:

pyenv virtualenv 3.12 myproject-env pyenv activate myproject-env

Установите зависимости, для работы приложения из файла requirement.txt:

pip install -r requirement.txt

Обязательно установите библиотеку uwsgi:

pip install uwsgi

Для выхода из виртуального окружения используйте команду: source deactivate

3. Настройка uWSGI

3.1 Конфигурация uWSGI

Нажмите сочетание клавиш 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 


Описание настроек в uwsgi

Здесь мы опишем некоторые настройки, которые нужно корректировать для запуска вашего приложения.

Переменная wsgi-file - указывает путь до главного файла, который отвечает за запуск вашего python приложения

Переменная callable - указывает uWSGI, какой объект в вашем Python-приложении является вызываемым. Например в Django используется параметр application, во Flask параметр app.

Переменная socket - указывает путь до сокета, по которому можно обращаться к приложению

Переменная virtualenv - указывает путь до виртуального окружения pyenv, откуда будут браться параметры для запуска приложения

Переменная pythonpath - указывает путь до каталога с файлами сайта, чтобы python понимал, откуда нужно подгружать файлы проекта

Переменная env-file - указывает путь до файла, откуда будут браться дополнительные переменные окружения, для работы приложения

Переменная logto - указываем путь до файла, куда будет писаться лог работы вашего приложения

3.2 Запуск uWSGI через systemd

Создайте сервис в 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


Описание настроек в systemd

Здесь мы опишем некоторые настройки, которые нужно корректировать для запуска вашего приложения.

Переменная 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

4. Настройка Nginx

Установите 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";
}
Описание настроек в nginx

Здесь мы опишем некоторые настройки, которые нужно корректировать для запуска вашего приложения.

Переменная 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

5. Управление python приложением

Старт приложения делается командом:

systemctl start uwsgi-sitename_ru

Остановка приложения делается командом:

systemctl stop uwsgi-sitename_ru

Проверить статус приложения можно командой:

systemctl status uwsgi-sitename_ru

6. Смена версии python для запущенного приложения

6.1 Установка новой версии python через pyenv

Переключаемся на пользователя 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

6.2 Корректировка настроек uWSGI для новой версии python

Нажмите сочетание клавиш 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.

Облачные VDS
Облачные VDS
Облачные VDS
Масштабируются под любые задачи: от размещения сайта до IT-инфраструктуры
С 2003 года
Надежность.
Нам доверяют тысячи компаний и разработчиков
21 год
Предоставляем услуги профессионального хостинга
35 000+
Клиентов доверяют нам размещение своих сайтов
99.99%
Подтвержденный uptime наших серверов хостинга
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
ВК49865