Как Django взаимодействует с Nginx и Gunicorn?

Ответ

В производственной среде Django-приложения обычно развертываются с использованием связки Nginx и Gunicorn. Эта архитектура обеспечивает масштабируемость, производительность и надежность, разделяя обязанности между компонентами:

  1. Gunicorn (Green Unicorn):

    • Роль: Gunicorn — это WSGI (Web Server Gateway Interface) HTTP-сервер для Python. Он запускает Django-приложение, выступая в роли посредника между веб-сервером (Nginx) и самим Django.
    • Функции: Gunicorn принимает HTTP-запросы от Nginx, преобразует их в формат, понятный Django, передает их приложению, а затем отправляет ответы обратно Nginx. Он управляет пулом рабочих процессов (workers) Django, обеспечивая параллельную обработку запросов.
    • Пример запуска:
      gunicorn myproject.wsgi:application --bind 0.0.0.0:8000 --workers 3

      Здесь myproject.wsgi:application указывает на WSGI-файл Django-проекта, --bind определяет адрес и порт, а --workers — количество рабочих процессов.

  2. Nginx:

    • Роль: Nginx — это высокопроизводительный веб-сервер, обратный прокси-сервер и балансировщик нагрузки. Он является первой точкой контакта для клиентских запросов.
    • Функции:
      • Обратный прокси: Nginx принимает все входящие HTTP-запросы от клиентов и перенаправляет (проксирует) запросы, предназначенные для Django-приложения, на Gunicorn.
      • Обслуживание статических и медиафайлов: Nginx эффективно отдает статические файлы (CSS, JavaScript, изображения) и медиафайлы напрямую клиентам, не нагружая Django-приложение. Это значительно повышает производительность.
      • Балансировка нагрузки: Может распределять запросы между несколькими экземплярами Gunicorn для повышения отказоустойчивости и масштабируемости.
      • SSL/TLS-терминация: Обрабатывает HTTPS-соединения, снимая эту нагрузку с Gunicorn/Django.

Пример конфигурации Nginx (/etc/nginx/sites-available/myproject):

server {
    listen 80;
    server_name example.com www.example.com;

    # Обслуживание статических файлов напрямую Nginx'ом
    location /static/ {
        alias /path/to/your/django/project/staticfiles/;
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }

    # Обслуживание медиафайлов напрямую Nginx'ом
    location /media/ {
        alias /path/to/your/django/project/mediafiles/;
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }

    # Проксирование всех остальных запросов к Gunicorn
    location / {
        proxy_pass http://127.0.0.1:8000; # Адрес, на котором слушает 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;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 100M; # Увеличение лимита на размер тела запроса
    }
}

Схема работы:
Клиент ➡️ Nginx (обслуживает статику/медиа, проксирует динамические запросы) ➡️ Gunicorn (запускает Django-приложение) ➡️ Django-приложение (обрабатывает логику) ➡️ Gunicorn ➡️ Nginx ➡️ Клиент

Эта связка позволяет Django сосредоточиться на бизнес-логике, Gunicorn — на эффективном выполнении Python-кода, а Nginx — на высокопроизводительной обработке HTTP-запросов и статического контента.