1. 1
  2. 2
  3. 3

# конспект · шаг 3 из 3

Конспект: шесть решений

выжимка - её можно унести в заметки

Главная схема курса: nginx обрабатывает запрос как фиксированную цепочку решений, и порядок не зависит от того, как написан конфиг.

Шесть решений

1. Какой server-блок отвечает?     ← listen + server_name + Host
2. Какой location внутри него?     ← правила приоритета
3. Нужно ли перенаправить/выйти?   ← return, rewrite
4. Кто отдаёт содержимое?          ← файл с диска или proxy_pass
5. Что добавить к ответу?          ← заголовки, сжатие
6. Что записать в лог?             ← access_log (ПОСЛЕ ответа)

Как этим пользоваться при разборе

Симптом Решение
открывается не тот сайт 1 - listen, server_name, Host
отдаётся не тот файл 2 или 4 - выбор location, root/alias/proxy_pass
внезапный редирект 3 - return, rewrite
пропали заголовки 5 - наследование add_header
в логе не то, что ждали 6 - формат и место access_log

Работает даже с чужим конфигом на пятьсот строк - именно потому, что порядок решений фиксирован.

Что важно помнить про порядок

  • Лог пишется после ответа, поэтому в нём есть код ответа и время;
  • return в server-блоке срабатывает раньше выбора location;
  • выбор server-блока идёт по listen и только потом по server_name.

server_name не фильтрует

Если на порту объявлен один server-блок, он ответит на ЛЮБОЙ заголовок Host, включая чужой: nginx обязан выбрать какой-то блок, а отказаться отвечать не может. server_name - это правило выбора, а не проверка доступа.

Чтобы не отвечать на чужие имена, заводят блок-заглушку:

/etc/nginx/conf.d/00-default.confhttp
server {
    listen 80 default_server;
    server_name _;
    return 444;
}

444 - особый код: nginx закрывает соединение, не отвечая вовсе.

Ловушка джокера

Читать конфиг сверху вниз, как программу. Nginx не выполняет директивы в порядке записи: он сначала выбирает блок и location, а потом применяет то, что внутри. Отсюда и знаменитое «почему сработало не то, что написано выше».

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.