Добавить в корзинуПозвонить
Найти в Дзене
Павлин Шарит

Nginx + Django: почему не стоит отдавать Django напрямую

Nginx + Django: почему не стоит отдавать Django напрямую Когда начинал с Django, долго не понимал зачем нужен nginx - ведь runserver прекрасно отдает контент Проблемы прямого подключения к Django: - Один процесс обслуживает все запросы (медленно) - Статические файлы обрабатывает Python (неэффективно) - Нет защиты от медленных клиентов - Сложно настроить SSL и кэширование Nginx как reverse proxy решает все сразу: server { listen 80; server_name mysite.com; # Статика отдается nginx напрямую location /static/ { alias /var/www/mysite/static/; expires 30d; } # API запросы проксируются в Django location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } Что получаем: - Nginx отдает статику в разы быстрее Python - Защита от медленных соединений - Компрессия gzip из коробки # Запускаем Django через gunicorn с несколькими воркерами gunicorn --workers 4 --bind 127.0.0.1:8000 myproject.wsgi Дополнительные плюсы: - Rate limitin

Nginx + Django: почему не стоит отдавать Django напрямую

Когда начинал с Django, долго не понимал зачем нужен nginx - ведь runserver прекрасно отдает контент

Проблемы прямого подключения к Django:

- Один процесс обслуживает все запросы (медленно)

- Статические файлы обрабатывает Python (неэффективно)

- Нет защиты от медленных клиентов

- Сложно настроить SSL и кэширование

Nginx как reverse proxy решает все сразу:

server {

listen 80;

server_name mysite.com;

# Статика отдается nginx напрямую

location /static/ {

alias /var/www/mysite/static/;

expires 30d;

}

# API запросы проксируются в Django

location / {

proxy_pass http://127.0.0.1:8000;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

}

}

Что получаем:

- Nginx отдает статику в разы быстрее Python

- Защита от медленных соединений

- Компрессия gzip из коробки

# Запускаем Django через gunicorn с несколькими воркерами

gunicorn --workers 4 --bind 127.0.0.1:8000 myproject.wsgi

Дополнительные плюсы:

- Rate limiting на уровне nginx

- SSL termination - HTTPS обрабатывает nginx, в Django приходит HTTP

- Кэширование ответов для статичных страниц

- Несколько доменов на одном сервере

То, как я деплою проекты в прод показывал (вместе с конфигами) на своем boosty