Почему нельзя использовать `manage.py runserver` в production-окружении Django

Ответ

Команда python manage.py runserver запускает встроенный в Django сервер, который предназначен исключительно для разработки и отладки. Использовать его в production-окружении категорически не рекомендуется по следующим причинам:

  1. Низкая производительность и масштабируемость

    • Сервер является однопоточным и обрабатывает запросы последовательно. Под нагрузкой он быстро станет узким местом.
  2. Проблемы с безопасностью

    • Он не проходил аудиты безопасности и не имеет защиты от распространенных веб-атак, таких как DoS-атаки.
  3. Нестабильность

    • Не предназначен для длительной работы и высоких нагрузок, может аварийно завершать работу без предупреждения.
  4. Неэффективная раздача статических файлов

    • Не оптимизирован для быстрой отдачи статики (CSS, JS, изображения), что замедляет загрузку сайта.

Правильное решение для Production

Для развертывания Django-приложений используется связка из нескольких компонентов:

  • WSGI/ASGI сервер: Принимает HTTP-запросы и преобразует их в понятный для Python формат.
    • WSGI (для синхронных приложений): Gunicorn, uWSGI.
    • ASGI (для асинхронных приложений): Uvicorn, Daphne.
  • Обратный прокси-сервер (Reverse Proxy): Nginx или Apache. Он принимает входящий трафик, раздает статику, обеспечивает SSL-терминацию, кэширование и передает запросы к приложению на WSGI/ASGI-сервер.

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

# Запуск 4 рабочих процессов, которые слушают порт 8000
gunicorn --workers 4 --bind 0.0.0.0:8000 myproject.wsgi:application

Ответ 18+ 🔞

Да ты посмотри, что они вытворяют, блядь! Сидят, значит, новички, только Django установили, и сразу — python manage.py runserver, и думают, что сайт готов к бою. Ну, блядь, ёпта, это же просто инструмент для разработки, а не боевой корабль!

Этот встроенный сервер — он как детский велосипед с подстраховочными колёсами. Для того, чтобы во дворе покататься и не убиться — самое то. Но выехать на нём на трассу МКАД? Да тебя, сука, размажут в первый же день, в рот меня чих-пых!

Почему? Да потому что он, этот сервер, — однопоточный уёбок. Он запросы обрабатывает по очереди, как в советской поликлинике. Один запрос пришёл — он его обрабатывает. Второй пришёл — сидит, ждёт, пока первый не обслужат. А если народу набежит овердохуища? Всё, пиздец, сайт ляжет и будет висеть, как мокрая простыня.

И безопасность там, блядь, на уровне детского сада. Его не проверяли на уязвимости, он не умеет отбиваться от всяких маньяков, которые пытаются сайт положить. Это как оставить квартиру с открытой дверью и надписью «заходите, всё ваше».

А ещё он для статики — полный пидарас шерстяной. Картинки, стили, скрипты — он их отдаёт медленнее, чем бабка в сельмаге сдачу считает. В продакшене так нельзя, там всё должно летать.

Так как же правильно, блядь?

Надо делать по-взрослому. Берёшь нормальный, боевой сервер приложений. Для обычных проектов — Gunicorn или uWSGI. Если проект на асинхронности — тогда Uvicorn.

А спереди ставишь Nginx — это такой здоровенный мужик-швейцар. Он весь входящий трафик встречает, статику отдаёт мгновенно, SSL-сертификаты проверяет, а запросы к твоему приложению аккуратно передаёт тому самому Gunicorn.

Вот смотри, как это выглядит в жизни:

# Запускаем Gunicorn с 4 рабочими процессами, слушаем порт 8000
gunicorn --workers 4 --bind 0.0.0.0:8000 myproject.wsgi:application

Вот это уже серьёзно. Четыре процесса — это четыре кассы вместо одной. Народ не толпится, всё быстро. А Nginx стоит перед ними и грамотно распределяет очередь.

Так что запомни раз и навсегда: runserver — это для отладки, чтобы посмотреть, как твоя форма выглядит. А для реальной работы — собирай нормальный стек. Не позорься, а то выйдешь в прод с этим велосипедом, и тебя засмеют, а сайт твой накроется медным тазом в первую же пятницу вечером.