Ответ
Production-развертывание Django — это настройка стека из нескольких взаимодействующих компонентов для обеспечения производительности, безопасности и отказоустойчивости.
Стандартная схема выглядит так: Веб-сервер (Reverse Proxy) -> WSGI/ASGI Сервер -> Django-приложение.
Ключевые компоненты стека:
-
Веб-сервер (Reverse Proxy) Обычно это Nginx или Apache. Он принимает все входящие HTTP-запросы от клиентов и выполняет две основные задачи:
- Отдача статических файлов (
static/,media/): Nginx делает это гораздо эффективнее, чем Django. - Проксирование запросов: Все остальные запросы (динамические) передаются на обработку WSGI-серверу.
Пример конфигурации Nginx:
server { listen 80; server_name your_domain.com; location /static/ { alias /path/to/your/project/static/; } location / { proxy_pass http://unix:/run/gunicorn.sock; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } - Отдача статических файлов (
-
WSGI/ASGI Сервер Это связующее звено между веб-сервером и Django-приложением. Он запускает несколько рабочих процессов Django и управляет ими.
- Gunicorn: Самый популярный и простой в настройке WSGI-сервер.
- uWSGI: Более мощный и гибкий, но сложнее в конфигурации.
- Uvicorn: Используется для асинхронных приложений (ASGI), если вы работаете с Django Channels или асинхронными представлениями.
Пример запуска с Gunicorn:
# --workers 3: запускает 3 рабочих процесса # --bind: указывает, где слушать запросы (unix-сокет или IP:порт) gunicorn --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application -
Менеджер процессов Systemd или Supervisor следят за тем, чтобы процесс WSGI-сервера (например, Gunicorn) всегда был запущен. Они автоматически перезапускают его в случае сбоя или после перезагрузки сервера.
Пример unit-файла для Systemd:
[Unit] Description=gunicorn daemon After=network.target [Service] User=your_user Group=www-data WorkingDirectory=/path/to/your/project ExecStart=/path/to/venv/bin/gunicorn --workers 3 --bind unix:/run/gunicorn.sock myproject.wsgi:application [Install] WantedBy=multi-user.target -
Управление конфигурацией Секретные ключи, пароли от баз данных и другие настройки должны храниться в переменных окружения, а не в коде, в соответствии с принципами 12-Factor App. Для локальной разработки часто используют
.envфайлы (например, с библиотекойpython-dotenv).
Ответ 18+ 🔞
А, ну вот, слушай, смотри. Разворачивать Django в продакшн — это ж не в игрушки играть, это тебе не python manage.py runserver на локалке запустить, где всё само работает, а потом охуеть, когда на реальном сервере всё падает, как карточный домик от первого же набега пользователей.
Короче, суть в том, что тебе нужно собрать этакий бутерброд, слоёный пирог из нескольких сервисов, чтобы они друг дружку не ебали, а наоборот, помогали. Схема классическая, как мир: Веб-сервер (это типа швейцар) -> WSGI-сервер (это официант) -> Твоё Django-приложение (это повар на кухне).
Итак, из каких же говн и палок этот пазл собирается:
-
Веб-сервер (он же обратный прокси, он же швейцар) Это обычно Nginx или, реже, Apache. Его задача — стоять на входе и принимать все пиздюли (то бишь HTTP-запросы) от интернета. И он делает две главные вещи:
- Раздаёт статику (картинки, CSS, JS). Потому что Nginx отдаёт файлы с такой скоростью, что твоему Django за ним, как за каменной стеной, только в штаны ссать от зависти. Зачем повару бегать с тарелками, если есть швейцар-спринтер?
- Проксирует запросы дальше. Всё, что не статика, он аккуратненько передаёт по сокету или на порт твоему WSGI-серверу. Типа: «Эй, официант, клиент заказал динамический контент, разбирайся!»
Вот тебе кусок конфига Nginx, чтоб не пиздел, что не видел:
server { listen 80; server_name твой_домен.ру; # сюда свой впиши, умник location /static/ { alias /путь/к/твоему/проекту/static/; # тут лежат твои CSS-ки } location / { proxy_pass http://unix:/run/gunicorn.sock; # а всё остальное — пуляй в сокет к Gunicorn proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } -
WSGI/ASGI Сервер (он же официант) Вот это — самое мясо. Твой
runserver— это как один повар, который и жарит, и моет посуду, и в туалет бегает. В продакшне так нельзя. Нужен сервер, который породит несколько рабочих процессов (workers) — это как бригада поваров на кухне.- Gunicorn — выбор ленивого гения. Просто, понятно, работает. Для 95% проектов — то, что надо.
- uWSGI — монстр с кучей настроек. Мощный, но если не разбираешься, можно так настроить, что он сам себя выебает.
- Uvicorn — для тех, кто упоролся на асинхронности. Если у тебя в Django Channels или асинхронные вьюхи — тебе сюда.
Как запустить Gunicorn, чтобы не позориться:
# --workers 3: запустит трёх работяг-процессов. Сколько ядер на сервере? Примерно столько и ставь. # --bind: говорит, где слушать. Unix-сокет — быстрее и безопаснее. gunicorn --workers 3 --bind unix:/run/gunicorn.sock мойпроект.wsgi:application -
Менеджер процессов (он же надсмотрщик) А что будет, если твой Gunicorn внезапно сдохнет от ошибки? Правильно, сайт ляжет. Нахуй это никому не нужно. Поэтому нужен Systemd (встроен в современные системы) или Supervisor, которые будут следить за этим процессом, как ястреб. Упал — мгновенно подняли. Сервер перезагрузился — автоматически запустили. Красота.
Глянь, как это примерно в systemd выглядит (unit-файл):
[Unit] Description=gunicorn daemon After=network.target # Чтоб запускался после сети, а не до, дурачок [Service] User=твой_юзер Group=www-data WorkingDirectory=/путь/к/твоему/проекту ExecStart=/путь/к/виртуальному/окружению/bin/gunicorn --workers 3 --bind unix:/run/gunicorn.sock мойпроект.wsgi:application [Install] WantedBy=multi-user.target -
Управление конфигурацией (чтоб не выкладывать секреты в репозиторий) Это, блядь, самое важное! Никогда, слышишь, НИКОГДА не клади
SECRET_KEY, пароли от базы, ключи API прямо вsettings.py. Это пиздец какой непрофессионализм. Всё это добро должно жить в переменных окружения. На локалке для удобства можно использовать.envфайлы (с помощьюpython-dotenv), но на сервере эти переменные должны быть заданы на уровне системы или через менеджер процессов (в том же systemd-файле вEnvironment=). Принцип 12-Factor App, ёпта, учи матчасть!
Вот такой вот слоёный пирог получается. Собрал его правильно — и спит спокойно. Собрал криво — получишь ночной звонок, что «сайт не работает», и будешь в 3 утра, ебаша кофе, искать, в каком именно слое ты накосячил. Удачи, не ебни!