Настройка gunicorn для Django приложения


Настройка gunicorn обычно нужна для Django, но использование gunicorn Django не ограничивается. gunicorn является производительным сервером приложений, его можно применять как сервер приложений для любого Python фреймворка.

В качестве фронтенда для gunicorn обычно устанавливается Nginx.



Установка и настройка gunicorn для Django приложения


gunicorn устанавливается в виртуальное окружение через pip

pip install gunicorn


Настройка gunicorn


pip freeze после успешной установки покажет модуль в списке.

После установки для проверки процесс сначала можно запустить вручную.

Сначала нужно перейти в каталог со скриптами приложения

cd ~/app



Точкой входа стандартно является wsgi.py, если это так команда для запуска примет следующий вид:


gunicorn --bind 0.0.0.0:5000 wsgi:app


В wsgi.py идет обращение к переменной app.


После запуска в тестовом режиме на порту 5000 вывод в консоль будет таким:

[2018-11-12 21:14:28 +0000] [24344] [INFO] Starting gunicorn 19.9.0
[2018-11-12 21:14:28 +0000] [24344] [INFO] Listening at: http://0.0.0.0:5000 (28217)
[2018-11-12 21:14:28 +0000] [24344] [INFO] Using worker: sync
[2018-11-12 21:14:28 +0000] [24344] [INFO] Booting worker with pid: 28220



Современные Ubuntu и CentOS в качестве системы инициализации используют systemd. Чтобы управлять сервисом gunicorn потребуется добавить Unit файл



mcedit /etc/systemd/system/app.service

[Unit]
Description=Gunicorn
After=network.target

[Service]
User=django
Group=www-data
WorkingDirectory=/home/django/app
Environment="PATH=/home/django/app/myprojectenv/bin"
ExecStart=/home/django/app/djangoenv/bin/gunicorn --workers 3 --bind unix:app.sock -m 007 wsgi:app

[Install]
WantedBy=multi-user.target


В нем задается пользователь и группа с правами которых запускается процесс application сервера.



Сам gunicorn запускается командой /home/django/app/djangoenv/bin/gunicorn --workers 3 --bind unix:app.sock -m 007 wsgi:app


Команда задается в systemd в качестве ExecStart. Можно выполнять её вручную в консоли в процессе отладки.

Будет использоваться 3 воркера и unix сокета вместо IP адреса и порта. Это более безопасное и более быстрое решение, но подходит оно только для случаев когда приложение работает на одной машине.



Если применяется кластер и веб-сервер находится на одном сервере, а приложение на другом использовать получится только TCP сокет.



Чтобы использовать gunicorn — в него настраивают проксирование — обычно средствами Nginx с портов 80 и 443.



Настройка Nginx для gunicorn и Django


Конфигурационный файл Nginx полностью соответствует тому, что используется для другого способа деплоя приложений на Python — wsgi.

Создается конфигурационный файл виртуального хоста Nginx и в нем прописывается путь к Unix сокету, по которому доступен сервер приложений, в данном случае — gunicorn

Сказать спасибо