Gunicorn (Green Unicorn) — Python-реализация WSGI (Web Server Gateway Interface) HTTP-сервера, портированная с Ruby Unicorn. Предназначен для запуска Python веб-приложений в production-среде. Gunicorn управляет пулом рабочих процессов (workers), каждый из которых обрабатывает HTTP-запросы через WSGI-интерфейс приложения. Запуск на VPS или выделенном сервере — стандартная среда для production.
Как работает
Gunicorn использует модель pre-fork: master-процесс принимает соединения и передаёт их воркерам через Unix-сокет или TCP. Воркеры — отдельные Python-процессы (или потоки/greenthreads при использовании gevent/eventlet). Master перезапускает упавших воркеров автоматически.
Типы воркеров:
- sync (по умолчанию) — один запрос за раз на воркер. Надёжно для CPU-bound задач.
- gthread — многопоточный воркер. Каждый воркер обрабатывает несколько запросов параллельно через потоки.
- gevent/eventlet — кооперативная многозадачность через greenlets. Эффективно для I/O-bound приложений.
- uvicorn.workers.UvicornWorker — ASGI-воркер для асинхронных приложений (FastAPI, Starlette, Django Channels).
Запуск: gunicorn -w 4 -b 127.0.0.1:8000 myapp.wsgi:application. Рекомендуемое количество воркеров: 2 * CPU + 1. На сервере с 4 ядрами — 9 воркеров.
Gunicorn не обрабатывает статические файлы, SSL, HTTP/2 — эти задачи выполняет фронтенд-прокси (nginx). Типичная связка в production: nginx → unix socket → Gunicorn → Django/Flask app.
История
Gunicorn создан Бенуа Шено в 2009 году как портирование Ruby Unicorn. Активно используется в связке с nginx как фронтенд-прокси начиная с 2010 года. Изначально поддерживал только WSGI (PEP 3333). С версией 20.0 (2020) добавлена поддержка Python 3 как основной платформы. WSGI определён в PEP 333 (2003) и обновлён в PEP 3333 (2010). ASGI (Asynchronous Server Gateway Interface, PEP на основе Django Channels) появился в 2015 году для async Python.
Gunicorn vs uWSGI vs uvicorn
| Сервер | Протокол | Async | Конфигурация |
|---|---|---|---|
| Gunicorn | WSGI (+ASGI через воркер) | Опционально (uvicorn worker) | Простая |
| uWSGI | WSGI, uwsgi, HTTP | Нет нативного | Сложная, богатая |
| uvicorn | ASGI | Нативно (asyncio) | Простая |
На что обращать внимание
Настройте timeout: по умолчанию 30 секунд. Длинные запросы (импорт данных, генерация PDF) — увеличьте до 120-300 секунд. Graceful reload без потери запросов: kill -HUP $GUNICORN_PID или systemctl reload. Настройте cron-задачу или systemd для автоматического перезапуска при сбое. В Docker Gunicorn запускайте через CMD без systemd — в контейнере он должен быть PID 1 или запускаться через init-обёртку. Логи Gunicorn пишутся в stdout/stderr — стандарт для контейнерных сред.
Мониторинг и логи
Gunicorn пишет access-логи и error-логи в stdout/stderr по умолчанию. В связке с systemd логи попадают в journald: journalctl -u gunicorn. При использовании Docker — docker logs. Для мониторинга числа воркеров и нагрузки используйте statsd-интеграцию Gunicorn или мониторинг сервера через Prometheus + process_exporter. Число активных воркеров: ps aux | grep gunicorn | wc -l.