Sobes.tech
Назад к вопросам
Junior — Middle
51

Можно ли использовать Nginx вместе с Django без промежуточного WSGI-сервера, например Gunicorn?

Компании, где спрашивали
TechCore

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Да, Nginx можно использовать с Django, но сам по себе он не исполняет Django-приложение. Обычно Nginx служит фронтенд-сервером для статики, TLS и проксирования, а Django запускают через WSGI/ASGI-сервер. Без промежуточного Python-сервера запросы к динамике Django Nginx обработать не сможет.

Определение:

Nginx — это веб-сервер и reverse proxy, а Django — Python-фреймворк, который требует среды исполнения через WSGI или ASGI. Поэтому Nginx может отдавать статические файлы и проксировать запросы дальше, но не заменяет Gunicorn, uWSGI или другой сервер приложений. Если убрать промежуточный сервер, Django просто не будет куда запускать Python-код на каждый HTTP-запрос.

Пример использования:

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

server {
    listen 80;
    server_name example.com;

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

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

Пояснение кода:

Код показывает типичную связку Nginx + Django через Gunicorn. Блок /static/ позволяет Nginx отдавать статические файлы без участия Python-приложения, что быстрее и дешевле по ресурсам. Блок / проксирует все остальные запросы на локальный порт 8000, где обычно слушает Gunicorn, и уже он передает запрос в Django.

Ключевые моменты:

  • Nginx не выполняет Django-код и не заменяет WSGI/ASGI-сервер.
  • Для production-схемы Django обычно запускают через Gunicorn, uWSGI или аналог.
  • Nginx удобно использовать как reverse proxy и сервер статики.
  • Без промежуточного сервера можно обойтись только в рамках девелоперского запуска Django, но не для production.
  • Если нужен именно асинхронный стек, вместо WSGI используют ASGI-сервер, например Uvicorn или Daphne.