Ответ
В производственной среде Django-приложения обычно развертываются с использованием связки Nginx и Gunicorn. Эта архитектура обеспечивает масштабируемость, производительность и надежность, разделяя обязанности между компонентами:
-
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
— количество рабочих процессов.
-
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-запросов и статического контента.