Установка и настройка NGINX

⏱ 30 мин · 🧩 заданий: 6

Зачем 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

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Несколько вариантов

Какие задачи выполняет NGINX перед Gunicorn?

Задание 2 Написать код

Допишите блок server: слушать порт 80, домены myblog.ru и www.myblog.ru, location /static/ раздаёт файлы из /home/deploy/blog/staticfiles/ (директива alias), а location / проксирует на http://unix:/run/gunicorn.sock.

Задание 3 Ввод ответа

Какой командой проверить конфигурацию NGINX на ошибки перед перезагрузкой?

Задание 4 Расставить по порядку

Расставьте шаги включения нового сайта в NGINX.

  1. Применить: sudo systemctl reload nginx
  2. Открыть порты: sudo ufw allow 'Nginx Full'
  3. Проверить конфигурацию: sudo nginx -t
  4. Сделать ссылку: sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/
  5. Создать файл /etc/nginx/sites-available/blog
Задание 5 Один вариант ответа

Сайт открывается, а NGINX отдаёт 502 Bad Gateway. Что проверить первым делом?

Задание 6 Один вариант ответа

Статика возвращает 403 Forbidden. Наиболее вероятная причина?

Войдите, чтобы отмечать пройденные уроки.