Установка и настройка NGINX
Зачем NGINX
Gunicorn умеет выполнять Django, но плохо подходит для прямой работы с интернетом: медленные клиенты, раздача файлов, HTTPS, защита от простых атак. Поэтому перед ним ставят NGINX — быстрый веб-сервер, который:
- принимает все соединения на портах 80 и 443;
- сам раздаёт статику (
/static/) и медиа (/media/) — в десятки раз быстрее Django; - остальные запросы передаёт Gunicorn (обратный прокси);
- обслуживает HTTPS (следующий урок);
- сжимает ответы, кэширует, ограничивает размер загрузок.
Интернет ──▶ NGINX :80/:443 ──▶ /static/, /media/ → файлы на диске
└──▶ всё остальное → unix:/run/gunicorn.sock → Django
Установка
sudo apt install nginx -y
sudo ufw allow 'Nginx Full' # порты 80 и 443
Откройте http://IP — приветственная страница NGINX.
Конфигурация сайта
/etc/nginx/sites-available/blog:
server {
listen 80;
server_name myblog.ru www.myblog.ru;
client_max_body_size 10M; # максимальный размер загрузки
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
alias /home/deploy/blog/staticfiles/;
expires 30d;
}
location /media/ {
alias /home/deploy/blog/media/;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
server_name— домены сайта;aliasподменяет путь:/static/css/blog.css→/home/deploy/blog/staticfiles/css/blog.css(слеши в конце обязательны в обоих местах);include proxy_paramsпередаёт Django заголовкиHost,X-Real-IP,X-Forwarded-For,X-Forwarded-Proto;expires 30d— браузер кэширует статику на месяц.
Включаем сайт и отключаем страницу по умолчанию:
sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
Всегда запускайте nginx -t перед reload — с ошибкой в конфигурации NGINX не перезапустится.
Права на файлы
NGINX работает от пользователя www-data. Чтобы он мог читать статику в домашней папке:
chmod 755 /home/deploy
Или храните статику и медиа в /var/www/blog/ и укажите эти пути в STATIC_ROOT, MEDIA_ROOT и конфигурации.
Проверка
Откройте http://myblog.ru — сайт работает, стили загружаются, админка оформлена.
Логи и типичные ошибки
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log
sudo journalctl -u gunicorn -f
| Ошибка | Где искать |
|---|---|
502 Bad Gateway |
Gunicorn не запущен или нет доступа к сокету — systemctl status gunicorn |
400 Bad Request |
Домен не в ALLOWED_HOSTS |
403 на статике |
Права на папки для www-data |
404 на статике |
Не выполнен collectstatic или ошибка в alias |
413 Request Entity Too Large |
Увеличьте client_max_body_size |
500 Internal Server Error |
Ошибка в Django — логи Gunicorn |
Сжатие
В /etc/nginx/nginx.conf включите gzip для текстовых ответов:
gzip on;
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
Итог
- NGINX — обратный прокси: раздаёт статику и медиа, остальное передаёт Gunicorn через сокет.
- Конфигурация — в
sites-available, включение — ссылкой вsites-enabled. - Перед применением —
nginx -t, затемsystemctl reload nginx. - 502 — проблема с Gunicorn, 400 —
ALLOWED_HOSTS, 403/404 на статике — права иcollectstatic.
Практика решено 0 из 6
Какие задачи выполняет NGINX перед Gunicorn?
Допишите блок server: слушать порт 80, домены myblog.ru и www.myblog.ru,
location /static/ раздаёт файлы из /home/deploy/blog/staticfiles/ (директива alias),
а location / проксирует на http://unix:/run/gunicorn.sock.
server {
listen 80;
server_name myblog.ru www.myblog.ru;
location /static/ {
alias /home/deploy/blog/staticfiles/;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
Какой командой проверить конфигурацию NGINX на ошибки перед перезагрузкой?
Расставьте шаги включения нового сайта в NGINX.
-
Применить:
sudo systemctl reload nginx -
Открыть порты:
sudo ufw allow 'Nginx Full' -
Проверить конфигурацию:
sudo nginx -t -
Сделать ссылку:
sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/ -
Создать файл
/etc/nginx/sites-available/blog
Сайт открывается, а NGINX отдаёт 502 Bad Gateway. Что проверить первым делом?
Статика возвращает 403 Forbidden. Наиболее вероятная причина?
Войдите, чтобы отмечать пройденные уроки.