Настройка NGINX + uWSGI для Python на Ubuntu

Обновлено и опубликовано Опубликовано:

Используемые термины: NGINXuWSGI, Python, Ubuntu.

В нашей инструкции будет рассмотрена настройка веб-сервера для поддержки приложений, разработанных на языке Python. Руководство рассчитано для операционных систем семейства Deb (Ubuntu, Debian, Mint).

Запуск 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

# Linux # NGINX # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет