Почему runserver нельзя использовать в продакшне
В Django уже есть встроенный веб-сервер — runserver. Его используют для быстрой отладки во время разработки. Но сами же разработчики Django прямым текстом пишут о том, что использовать в продакшне его не стоит:
DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests.
Gunicorn быстрее и заботится о безопасности. Его можно использовать в продакшне, и даже ребята из Django советуют это делать.
Больше деталей
Каждая страничка сайта генерирует десятки запросов к серверу. Браузеру помимо HTML нужны файлы CSS, JS и картинки. Каждый файл – это отдельный запрос к серверу. Если всё сложить, то наберётся их с несколько десятков. И так для каждой страницы сайта.
Кроме общего большого количества запросов есть ещё и вторая проблема. Файл не всегда укладывается по размеру в один TCP-сегмент, и веб-сервер вынужден отправлять его клиенту порциями, по-частям. Серверу приходится либо держать все файлы в памяти до завершения закачки и потреблять гигабайты RAM, либо читать файлы из файловой системы так же порциями. Задача эта не то, чтобы супер-сложная, но требует повышенной осторожности.
Браузеры и прочие клиенты нынче умные и не хотят скачивать лишнего. На своей стороне они держат кэш и в запросе сообщают вместе с названием файла и таймстемп момента, когда скачивали его последний раз. Получается, что веб-сервер также должен следить за файловой системой и сверять таймстемпы. Если файл не менялся, то сервер отвечает клиенту статусом 304 Not Modified.
На этом функциональность веб-сервера не заканчивается. Надо ещё научиться использовать несколько CPU параллельно на одном сервере, добавить поддержку HTTPS и HTTP/2. Причём всё это должно работать надёжно и точно следовать стандартам.
Получаем сочетание сразу из трёх трудно выполнимых требований:
- богатый функционал
- высокая производительность
- защита от атак злоумышленников
Достичь всего и сразу трудно. Django runserver такое не тянет. Выберите другой надёжный и проверенный веб-сервер. Обратите внимание на Nginx.