1. 1
  2. 2
  3. 3
  4. 4

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

Конспект: наследование и три исключения

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

Директивы наследуются вниз по контекстам, но у этого правила есть три исключения, и все три встречаются каждый день.

Основное правило

Директива, заданная в http, действует во всех server; заданная в server - во всех location. Ближайшее к месту значение побеждает.

http {
    gzip on;                    # для всех сайтов
    server {
        root /var/www/shop;     # для всего сайта
        location /downloads/ {
            root /mnt/big-disk; # тут корень другой - ближайший побеждает
        }
    }
}

Три исключения

Исключение Что происходит
директивы-списки замещаются целиком один add_header в location отменяет все унаследованные. Так же ведут себя proxy_set_header, fastcgi_param, limit_req, limit_conn, access_log, error_page, allow/deny
обработчик содержимого не наследуется вложенный location внутри location с proxy_pass не проксирует: обработчика у него нет, и запрос уходит на диск. То же с try_files
alias живёт только в location наследовать его неоткуда: выше по дереву он запрещён

Как проверять, а не гадать

add_header X-Debug "здесь" always;    # временно в спорный блок
$  команда
curl -I http://shop.local/path/

Заголовок пришёл - блок выбран и директива действует. Второй способ, лучше - собрать вопрос в задачу симулятора и посмотреть трассу.

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

  • «Я же добавил заголовок в http». Достаточно одного add_header в location - и все заголовки уровнем выше исчезают, включая заголовки безопасности. С 1.29.3 поведение управляется директивой add_header_inherit (on/off/merge), но по умолчанию правило прежнее: всё или ничего.
  • Один proxy_set_header в location стирает остальные. Вместе с ними бэкенд теряет настоящий адрес клиента и схему запроса, хотя добавленная строка про адреса ничего не говорила.
  • Вложенный location ради одной мелочи ломает проксирование. Симптом - 404 на адресах, которые вчера работали, или отдача файла с диска вместо ответа приложения.
  • Все три исключения включает ДОБАВЛЕНИЕ строки, а не удаление. Поэтому правку конфига читают не по диффу, а по вопросу «какой блок она затрагивает целиком».

Комментарии

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

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

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