# конспект · шаг 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 - это правило выбора, а не проверка доступа.
Чтобы не отвечать на чужие имена, заводят блок-заглушку:
server {
listen 80 default_server;
server_name _;
return 444;
}
444 - особый код: nginx закрывает соединение, не отвечая вовсе.
Ловушка джокера
Читать конфиг сверху вниз, как программу. Nginx не выполняет директивы в порядке записи: он сначала выбирает блок и location, а потом применяет то, что внутри. Отсюда и знаменитое «почему сработало не то, что написано выше».
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий