PRO

Как настроить Gunicorn + Nginx + Docker для продакшн-деплоя?

Типичная production-схема состоит из Nginx как reverse proxy, Gunicorn как WSGI-сервера и Docker-контейнера с Django-приложением. Nginx принимает внешний HTTP/HTTPS-трафик и раздаёт статику, Gunicorn обслуживает Django, а настройки и секреты передаются через окружение или secrets manager.
Подробный ответ

Роли компонентов

  • Nginx принимает HTTP/HTTPS, завершает TLS, ограничивает размер запросов, раздаёт static/media и проксирует динамические запросы;

  • Gunicorn запускает Django через WSGI и управляет web workers;

  • Docker упаковывает приложение и зависимости в воспроизводимый образ;

  • PostgreSQL, Redis и worker-процессы обычно запускаются отдельными сервисами или используются как managed services.

Dockerfile

FROM python:3.12-slim

WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .
RUN python manage.py collectstatic --noinput

CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "3", "--access-logfile", "-"]

Конфигурация Nginx

server {
    listen 80;
    server_name example.com;

    location /static/ {
        alias /var/www/static/;
    }

    location / {
        proxy_pass http://web:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Важные production-настройки Django

Нужно отключить DEBUG, задать ALLOWED_HOSTS, безопасно хранить SECRET_KEY, настроить trusted origins, HTTPS и secure cookies, выполнить collectstatic, миграции и проверку python manage.py check --deploy. Миграции запускают отдельным шагом деплоя, а не одновременно в каждом web-контейнере.

Надёжность и наблюдаемость

В production нужны health endpoint, structured logs, ограничение ресурсов контейнера, graceful shutdown, readiness probes и мониторинг ошибок. Образ стоит собирать один раз в CI, проверять тестами и затем продвигать между окружениями без пересборки.

Как ответить на собеседовании

Я запускаю Django в Docker через Gunicorn, а Nginx ставлю перед ним как reverse proxy и сервер статики. В production отключаю DEBUG, настраиваю ALLOWED_HOSTS, TLS, переменные окружения и health checks; миграции и collectstatic выполняю контролируемыми этапами CI/CD.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге