Развертывание Django приложения — это больше, чем просто запуск сервера разработки. В production среде вам нужен надежный веб-сервер, который будет обрабатывать статические файлы, балансировать нагрузку и обеспечивать безопасность. Давай разберем, как правильно настроить nginx для работы с Django, чтобы твое приложение работало быстро и стабильно.
Архитектура связки nginx + Django
Перед тем как погружаться в настройку, важно понять, как будут взаимодействовать компоненты:
- Nginx — фронтенд-сервер, принимает HTTP/HTTPS запросы от клиентов
- Gunicorn/uWSGI — WSGI-сервер, запускает Python код Django
- Django — собственно твое приложение
- Статические файлы — обслуживаются напрямую nginx для скорости
- Медиа файлы — могут обслуживаться nginx или через Django
Шаг 1: Установка и базовая настройка
Установка необходимых компонентов
# Для Ubuntu/Debian
sudo apt update
sudo apt install nginx python3-pip python3-venv
# Установка Gunicorn в виртуальное окружение
pip install gunicorn
# Проверка версии nginx
nginx -v
Подготовка Django проекта
Убедись, что твой проект готов к production:
# Собираем статические файлы
python manage.py collectstatic
# Настраиваем ALLOWED_HOSTS в settings.py
ALLOWED_HOSTS = ['your-domain.com', 'localhost', '127.0.0.1']
# Отключаем DEBUG режим
DEBUG = False
Шаг 2: Настройка Gunicorn
Gunicorn будет запускать твое Django приложение. Создадим systemd сервис для управления:
# Создаем systemd сервис файл
sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon for Django
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/path/to/your/django/project
ExecStart=/path/to/venv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
your_project.wsgi:application
[Install]
WantedBy=multi-user.target
# Запускаем и включаем сервис
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn
Шаг 3: Конфигурация nginx для Django
Основной конфигурационный файл
server {
listen 80;
server_name your-domain.com www.your-domain.com;
# Логи
access_log /var/log/nginx/django_access.log;
error_log /var/log/nginx/django_error.log;
# Максимальный размер загружаемых файлов
client_max_body_size 100M;
# Статические файлы
location /static/ {
alias /path/to/your/django/project/staticfiles/;
expires 1y;
add_header Cache-Control "public, immutable";
}
# Медиа файлы
location /media/ {
alias /path/to/your/django/project/media/;
expires 30d;
add_header Cache-Control "public";
}
# Проксирование к Gunicorn
location / {
proxy_pass http://unix:/run/gunicorn.sock;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Таймауты
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
# Запрещаем доступ к скрытым файлам
location ~ /\. {
deny all;
}
# Запрещаем доступ к敏感 файлам
location ~* \.(py|sql|log|env)$ {
deny all;
}
}
sudo nginx -t. Ошибки в конфиге могут привести к остановке сервера.
Активация конфигурации
# Копируем конфиг в sites-available
sudo cp django.conf /etc/nginx/sites-available/django-project
# Создаем символическую ссылку в sites-enabled
sudo ln -s /etc/nginx/sites-available/django-project /etc/nginx/sites-enabled/
# Проверяем конфигурацию
sudo nginx -t
# Перезагружаем nginx
sudo systemctl reload nginx
Шаг 4: Настройка SSL с Let's Encrypt
HTTPS обязателен для production. Используем Certbot для автоматического получения сертификатов:
# Установка Certbot
sudo apt install certbot python3-certbot-nginx
# Получение SSL сертификата
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
# Автоматическое обновление
sudo certbot renew --dry-run
Шаг 5: Оптимизация производительности
Ключевые параметры оптимизации:
| Параметр | Рекомендуемое значение | Описание |
|---|---|---|
| worker_processes | auto | Количество worker процессов (обычно равно количеству CPU ядер) |
| worker_connections | 1024 | Максимальное количество соединений на worker |
| keepalive_timeout | 65 | Таймаут keep-alive соединений в секундах |
| gzip | on | Включение сжатия для уменьшения трафика |
# /etc/nginx/nginx.conf - оптимизация
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
http {
# Базовые настройки
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# Gzip сжатие
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript;
# Кэширование файловых дескрипторов
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
Шаг 6: Мониторинг и логирование
# Просмотр логов nginx в реальном времени
sudo tail -f /var/log/nginx/django_access.log
sudo tail -f /var/log/nginx/django_error.log
# Просмотр логов Gunicorn
sudo journalctl -u gunicorn -f
# Проверка статуса сервисов
sudo systemctl status nginx
sudo systemctl status gunicorn
Частые проблемы и их решения
Распространенные ошибки:
- 502 Bad Gateway — проверь, что Gunicorn запущен и сокет существует
- 403 Forbidden — проверь права доступа к статическим файлам
- Статические файлы не отображаются — проверь путь в конфиге nginx
- Слишком медленная загрузка — включи gzip и проверь кэширование
# Проверка прав доступа
sudo chown -R www-data:www-data /path/to/your/django/project
sudo chmod -R 755 /path/to/your/django/project/staticfiles
# Проверка сокета Gunicorn
ls -la /run/gunicorn.sock
# Перезапуск всех сервисов
sudo systemctl restart gunicorn
sudo systemctl reload nginx
Дополнительные улучшения
Для enterprise-проектов рассмотри:
- Балансировка нагрузки — несколько инстансов Gunicorn за nginx
- Кэширование — Redis/Memcached для кэширования ответов
- CDN — Cloudflare или аналоги для статических файлов
- Мониторинг — Prometheus + Grafana для метрик
- Docker — контейнеризация для consistency
FAQ: Ответы на частые вопросы
Чем отличается Gunicorn от uWSGI?
Gunicorn проще в настройке и хорошо работает для большинства проектов. uWSGI предлагает больше возможностей для тонкой настройки и лучше подходит для высоконагруженных систем. Для старта рекомендуем Gunicorn.
Сколько worker процессов использовать в Gunicorn?
Общее правило: (2 × количество ядер CPU) + 1. Для 4-ядерного процессора: (2 × 4) + 1 = 9 workers. Начинай с 3-4 workers и мониторь нагрузку.
Как обслуживать медиа файлы в production?
Для небольших проектов — через nginx (как в примере выше). Для больших объемов — используй облачные хранилища (S3, Google Cloud Storage) с CDN.
Нужно ли настраивать кэширование в nginx для Django?
Для статических файлов — обязательно. Для динамического контента — осторожно, так как это может кэшировать персонализированные данные. Используй proxy_cache только для публичных страниц.
Заключение
Правильная настройка nginx для Django — это фундамент стабильного production окружения. Помни основные принципы:
- Всегда используй WSGI сервер (Gunicorn/uWSGI) вместо runserver
- Статические файлы должны обслуживаться nginx напрямую
- Настрой HTTPS с помощью Let's Encrypt
- Мониторь логи и метрики производительности
- Тестируй изменения на staging перед production
Эта конфигурация покрывает 90% use cases для Django проектов. Для специфичных требований (высокая нагрузка, микросервисы, геораспределение) потребуются дополнительные настройки, но база останется той же.