Ответ
Команда python manage.py runserver запускает встроенный в Django сервер, который предназначен исключительно для разработки и отладки. Использовать его в production-окружении категорически не рекомендуется по следующим причинам:
-
Низкая производительность и масштабируемость
- Сервер является однопоточным и обрабатывает запросы последовательно. Под нагрузкой он быстро станет узким местом.
-
Проблемы с безопасностью
- Он не проходил аудиты безопасности и не имеет защиты от распространенных веб-атак, таких как DoS-атаки.
-
Нестабильность
- Не предназначен для длительной работы и высоких нагрузок, может аварийно завершать работу без предупреждения.
-
Неэффективная раздача статических файлов
- Не оптимизирован для быстрой отдачи статики (CSS, JS, изображения), что замедляет загрузку сайта.
Правильное решение для Production
Для развертывания Django-приложений используется связка из нескольких компонентов:
- WSGI/ASGI сервер: Принимает HTTP-запросы и преобразует их в понятный для Python формат.
- WSGI (для синхронных приложений):
Gunicorn,uWSGI. - ASGI (для асинхронных приложений):
Uvicorn,Daphne.
- WSGI (для синхронных приложений):
- Обратный прокси-сервер (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 — это для отладки, чтобы посмотреть, как твоя форма выглядит. А для реальной работы — собирай нормальный стек. Не позорься, а то выйдешь в прод с этим велосипедом, и тебя засмеют, а сайт твой накроется медным тазом в первую же пятницу вечером.