Почему нельзя использовать встроенный сервер Django (runserver) в продакшене

Ответ

Команда manage.py runserver запускает легковесный сервер, предназначенный исключительно для разработки и отладки. Использовать его в продакшене небезопасно и неэффективно по нескольким причинам:

  1. Низкая производительность. Сервер является однопоточным и может обрабатывать только один запрос за раз. Под реальной нагрузкой он быстро станет узким местом и не сможет обслуживать конкурентных пользователей.

  2. Отсутствие аудита безопасности. Он не проходил тщательного тестирования на уязвимости, в отличие от промышленных серверов (Gunicorn, uWSGI), и не имеет встроенных механизмов защиты от многих видов атак.

  3. Неэффективная обработка статики. Встроенный сервер не предназначен для раздачи статических файлов (CSS, JS, изображения). В продакшене эту задачу должен выполнять специализированный веб-сервер, например, Nginx, который делает это гораздо быстрее.

Правильный стек для продакшена:

Обычно используется связка из веб-сервера (Nginx) и WSGI/ASGI-сервера (Gunicorn, uWSGI).

  • Nginx принимает входящие HTTP-запросы и отдает статику.
  • Gunicorn запускает несколько рабочих процессов вашего Django-приложения и обрабатывает динамические запросы, переданные от Nginx.

Пример запуска с Gunicorn:

# Установка WSGI-сервера
pip install gunicorn

# Запуск 4 рабочих процессов для обслуживания приложения
# myproject.wsgi - это путь к WSGI-файлу вашего проекта
gunicorn --workers 4 myproject.wsgi:application