Ответ
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).