Настройка NGINX + uWSGI для Python на Ubuntu
Используемые термины: NGINX, uWSGI, Python, Ubuntu.
В нашей инструкции будет рассмотрена настройка веб-сервера для поддержки приложений, разработанных на языке Python. Руководство рассчитано для операционных систем семейства Deb (Ubuntu, Debian, Mint).
Запуск uWSGI приложения
Настройка uWSGI сервиса
NGINX + uWSGI
Настройка uWSGI
Установка и настройка NGINX
Читайте также
Запуск uWSGI приложения
Устанавливаем python и дополнительные компоненты:
apt-get update
apt-get install python3 python3-dev python3-pip
* где:
- python3 — сам python третьей версии.
- python3-dev — стандартный набор библиотек. Нужен для установки и сборки дополнительных модулей.
- python3-pip — система управления пакетами для python.
Устанавливаем дополнительные пакеты для python:
pip3 install virtualenv uwsgi
* где:
- virtualenv — утилита для создания изолированного python-окружения.
- uwsgi — веб-сервер для интерпретации кода, в нашем случае, python.
uWSGI установлен — посмотрим версию приложения:
uwsgi --version
Создаем каталог, в котором разместим наше тестовое приложение:
mkdir -p /var/www/python_app
... и перейдем в созданный каталог:
cd /var/www/python_app
Создадим файл со следующим содержимым:
vi wsgi.py
#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"<h1>Hello World</h1>"]
* в данном примере мы просто выводим на экран знаменитую фразу "Hello World".
Если в нашей системе используется брандмауэр с запрещающими правилами, открываем порт 8080:
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
Сохраняем правила:
apt-get install iptables-persistent
netfilter-persistent save
Создаем виртуальное окружение:
virtualenv myappenv
Активируем созданное окружение командой:
source myappenv/bin/activate
Запускаем веб-сервер на порту 8080:
uwsgi --socket 0.0.0.0:8080 --protocol=http -w wsgi
Открываем браузер и переходим по адресу http://<IP-адрес нашего сервера>:8080 — мы должны увидеть нашу страницу "Hello World".
Веб-сервер работает. Остановим его работу комбинацией клавиш Ctrl + С и деактивируем виртуальную среду:
deactivate
Переходим к настройке uWSGI в качестве демона.
Сервис uWSGI
Чтобы не запускать сервис для каждого приложения вручную, необходимо настроить веб-сервер uWSGI. Он будет контролировать процесс работы с каждым приложением и позволит задать индивидуальные параметры с помощью конфигурационных файлов.
Устанавливаем веб-сервер командой:
apt-get install uwsgi uwsgi-plugin-python3
Создаем конфигурационный файл следующего содержания:
vi /etc/uwsgi/apps-enabled/python_app.ini
[uwsgi]
module = wsgi:application
chdir = /var/www/python_app
plugins = python3
max-requests = 5000
processes = 5
threads = 2
master = true
http = 0.0.0.0:8080
die-on-term = true
* где:
- chdir — в данный каталог необходимо перейти до запуска сервиса. Это должен быть путь с нашим приложением.
- plugins — uwsgi может работать не только с python, поэтому мы явно указываем плагин и версию языка.
- max-requests — количество запросов, после достижения которых должны перезапуститься воркеры.
- processes — количество воркеров, которые будут запущены при старте сервиса.
- threads — число потоков, которые будут доступны для каждого из воркеров.
- master — разрешить или запретить мастер процесс.
- http — задаем адрес интерфейса и порт, на которых будет слушать сервис.
- die-on-term — завершать работу или перезапускать сервис, если подан сигнал SIGTERM. В данном примере будет выполнен выход.
Разрешаем и стартуем сервис:
systemctl enable uwsgi
systemctl restart uwsgi
Открываем браузер и переходим по адресу http://<IP-адрес нашего сервера>:8080/ — должна открываться наша страница Hello World.
uWSGI + NGINX
По сути, наш сервер готов к работе, но очень часто, uWSGI настраивается в связке с NGINX, который берет на себя задачи по проксированию запросов http и отдачи статики. Рассмотрим пример настройки данной связки.
Изменение настроек uWSGI
Откроем на редактирование ранее созданный конфигурационный файл:
vi /etc/uwsgi/apps-enabled/python_app.ini
Закомментируем строку:
#http = 0.0.0.0:8080
* мы будем обращаться к uWSGI через сокетный файл, таким образом, держать сервис на отдельном порту избыточно.
Добавим к нашей настройке:
[uwsgi]
...
socket = wsgi.sock
chmod-socket = 660
vacuum = true
uid = www-data
gui = www-data
* где:
- socket — путь до сокетного файла, через который будут взаимодействовать наши uWSGI и NGINX.
- chmod-socket — выставляем права на сокетный файл.
- vacuum — удалять или нет при старте сервиса ранее созданные сокетные файлы.
- uid — назначает владельца сокетного файла.
- gui — назначает группу владельца сокетного файла.
Меняем владельца каталога нашего проекта на пользователя, под которым работает NGINX (в Ubuntu это, как правило, www-data):
chown -R www-data:www-data /var/www/python_app
Перезапускаем uwsgi:
systemctl restart uwsgi
Установка и настройка NGINX
Переходим к настройке NGINX. Для начала, установим его:
apt-get install nginx
Разрешим автозапуск:
systemctl enable nginx
Откроем на редактирование конфигурационный файл default:
vi /etc/nginx/sites-enabled/default
* это самый простой путь для тестирования нашей настройки. Для продуктивной среды хорошим тоном будет настройка виртуальных доменов.
Приведем location / к следующему виду:
location / {
#try_files $uri $uri/ =404;
include uwsgi_params;
uwsgi_pass unix:/var/www/python_app/wsgi.sock;
try_files $uri $uri/ /wsgi.py?$query_string;
}
* в данном примере мы все запросы переводим на файл wsgi.py с передачей в качестве аргументов строки запроса. Все запросы передадутся на uWSGI через сокетный файл wsgi.sock, находящийся в каталоге нашего проекта.
Проверим корректность настройки nginx:
nginx -t
Перезапустим его:
systemctl restart nginx
Готово, открываем браузер и переходим по адресу http://<IP-адрес нашего сервера>/ (уже без указания на порт) — должна открываться все та же страница Hello World.
Читайте также
Развертывание Django проекта на сервере NGINX в Linux Ubuntu