← Назад к вопросам

Почему Django предупреждает в консоли, что не следует использовать встроенный сервер в продакшене?

1.3 Junior🔥 121 комментариев
#Асинхронность и многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Почему Django предупреждает о встроенном сервере в продакшене

Django встроенный сервер разработки (python manage.py runserver) явно не предназначен для использования в production. Вот почему это критично важно:

1. Отсутствие оптимизации производительности

Встроенный сервер — это single-threaded и synchronous. Он обрабатывает запросы последовательно, а не параллельно.

# runserver работает примерно так (упрощённо):
while True:
    request = wait_for_request()
    response = process_request(request)  # Блокирующая операция
    send_response(response)
    # Во время обработки других запросы ждут в очереди

В production у тебя может быть сотни одновременных пользователей, и этот сервер просто задохнётся.

2. Отсутствие балансировки и масштабирования

Встроенный сервер не может:

  • Распределять нагрузку на несколько worker процессов
  • Перезагружаться gracefully при развёртывании новой версии
  • Автоматически перезапускаться при крахах
  • Работать за load balancer (Nginx, HAProxy)

Правильная архитектура production:

Client → Nginx (load balancer, reverse proxy)
              ↓
         ┌────┴────┐
         ↓         ↓
      Gunicorn 1 Gunicorn 2 (несколько worker процессов)
         ↓         ↓
      Django app (одна копия кода)
         ↓
      Database

3. Отсутствие статических файлов и медиа

Встроенный сервер может автоматически раздавать CSS, JS, картинки в development:

# settings.py (dev)
STATIC_URL = '/static/'
DEBUG = True  # Автоматически раздаёт статику

В production DEBUG = False, и встроенный сервер не будет раздавать статику. Для этого нужен отдельный веб-сервер (Nginx) или CDN.

4. Отсутствие безопасности

  • Встроенный сервер выводит полные traceback всех ошибок в response (DEBUG=True)
  • Нет защиты от slow loris атак (клиент медленно отправляет запрос, занимая worker)
  • Нет rate limiting
  • Нет аутентификации для доступа
# settings.py (dev) — небезопасно для production
DEBUG = True  # Показывает все ошибки и переменные окружения!

5. Отсутствие обработки сигналов и graceful shutdown

Встроенный сервер не может:

  • Корректно обработать SIGTERM и завершить активные запросы
  • Закрыть соединения с БД перед выключением
  • Выполнить cleanup код

При kill -9 на встроенном сервере могут быть потеряны данные.

6. Проблемы с кодированием и потоковой передачей

Встроенный сервер может неправильно обрабатывать:

  • Большие файлы (streaming responses)
  • Долгие соединения (WebSockets требуют специальной поддержки)
  • Различные кодировки символов
  • HTTP/2 и HTTP/3

Как это работает в продакшене

Правильный стек для Django в production:

# WSGI server — обрабатывает HTTP и управляет worker процессами
gunicorn myproject.wsgi:application --workers 4 --worker-class sync

# Или async ASGI для WebSockets:
uvicorn myproject.asgi:application --workers 4

# Nginx спереди — раздаёт статику и balancе запросы
# Supervisor/systemd — следит, что Gunicorn не упал
# PostgreSQL/Redis — БД и кэш

Почему именно Gunicorn?

  • Легко масштабируется (несколько worker процессов)
  • Поддержка pre-fork model (graceful reload новых версий)
  • Работает за reverse proxy (Nginx)
  • Меньше памяти чем встроенный сервер Django

Историческая справка

Django создавался в 2005 году, когда веб был проще. Встроенный сервер был нужен для быстрого старта разработки. Сейчас это рудимент, но оставлен для удобства разработчиков.

Итог: встроенный сервер — это инструмент для разработки на ноутбуке, не больше. Production требует industrial-grade WSGI/ASGI сервера с поддержкой масштабирования, безопасности и надёжности.

Почему Django предупреждает в консоли, что не следует использовать встроенный сервер в продакшене? | PrepBro