Настройка gunicorn обычно нужна для Django, но использование gunicorn Django не ограничивается. gunicorn является производительным сервером приложений, его можно применять как сервер приложений для любого Python фреймворка.
В качестве фронтенда для gunicorn обычно устанавливается Nginx.
Установка и настройка gunicorn для Django приложения
gunicorn устанавливается в виртуальное окружение через pip
pip install 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