Блог AST-SoftPro
Gunicorn и Nginx: деплой Python-приложений в продакшн
Введение в деплой Python-приложений
Деплой веб-приложения на Python — это не просто запуск скрипта. Даже самая простая Flask- или Django-обработка требует масштабируемой инфраструктуры: WSGI-сервера, reverse proxy и корректной настройки SSL, логирования и мониторинга. В продакшене нельзя полагаться только на python app.py. Такое решение подойдёт для разработки, но не обеспечит стабильность, безопасность и производительность в условиях реального трафика. Вместо этого используют комбинацию:
-
Gunicorn — WSGI-сервер, управляющий процессами Python-приложения;
-
Nginx — reverse proxy с поддержкой SSL, статических файлов и балансировки нагрузки. В статье описаны этапы настройки этой пары для деплоя в продакшн: от базовой конфигурации до логирования и мониторинга.
Почему Gunicorn?
Gunicorn (Green Unicorn) — это легковесный WSGI-сервер, разработанный специально для Python-приложений. Он не является веб-сервером напрямую, но эффективно управляет процессами приложений через модели 'prefork' или 'gevent'.
Основные преимущества:
-
Простота интеграции с Flask и Django;
-
Поддержка нескольких рабочих процессов (workers) — позволяет масштабироваться под нагрузку;
-
Эффективное использование CPU за счёт асинхронной обработки в режиме --worker-class=gunicorn.worker.gevent.GeventWorker.
Пример запуска Gunicorn:
gunicorn --workers 4 --bind unix:app.sock myproject.wsgi:application
Настройка Nginx как reverse proxy
Nginx не выполняет логику приложения, но он критически важен для:
-
Принятия HTTP-запросов;
-
Передачи их Gunicorn (reverse proxy);
-
Обслуживания статических ресурсов (CSS, JS, изображения);
-
Поддержки HTTPS через SSL-сертификаты.
Базовая конфигурация Nginx
Файл /etc/nginx/sites-available/myapp:
server {
listen 80;
server_name example.com www.example.com;
location /static/ {
alias /home/app/static/;
}
location / {
proxy_pass http://unix:/path/to/app.sock; # Unix socket от Gunicorn
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Настройка SSL с Let's Encrypt
Безопасность — обязательный элемент продакшн-среды. Использование HTTPS не только повышает доверие, но и защищает данные пользователей.
Шаги:
-
Установить Certbot (для получения сертификатов от Let’s Encrypt);
-
Конфигурация Nginx для SSL;
-
Автоматическое обновление сертификата через cron.
Пример добавления HTTPS в конфигурацию Nginx:
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include snippets/ssl-params.conf; # Рекомендованные настройки безопасности
location / {
proxy_pass http://unix:/path/to/app.sock;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Логирование в продакшн-среде
Логирование — ключевой элемент диагностики и мониторинга. Без него сложно отслеживать ошибки, анализировать производительность или реагировать на сбои.
Рекомендации:
-
Разделение логов: Gunicorn + Nginx должны вести свои логи;
-
Централизованная система: использование syslog или Fluentd для сбора;
-
Уровень детализации — ERROR, WARNING и INFO в зависимости от среды.
Пример конфигурации gunicorn.conf.py:
loglevel = 'info' access_logfile = '/var/log/gunicorn/access.log' error_logfile = '/var/log/gunicorn/error.log'
Мониторинг производительности и доступности
Даже при правильной настройке система может выйти из строя. Поэтому необходим мониторинг.
Что мониторить:
-
Доступность сервиса (HTTP 200 OK);
-
Время ответа;
-
Количество активных процессов Gunicorn;
-
Объём логов в реальном времени. Инструменты: Prometheus + Grafana, или простые скрипты на основе curl и grep.