Nginx

Nginx Directive Inheritance Analyzer

Построить дерево наследования директив http/server/location и найти скрытые проблемы вроде add_header без inherit.

Как это работает

Один из самых коварных фактов про nginx, который не написан крупными буквами ни в одном туториале: директива add_header, объявленная на уровне server, полностью перестаёт действовать в location, если в этом самом location есть хотя бы одна собственная add_header. Не дополняется, не мержится — обнуляется целиком. То же самое происходит с proxy_set_header и ещё парой директив с похожей, не самой интуитивной моделью наследования. Nginx Directive Inheritance Analyzer online строит реальное дерево наследования по вашему конфигу и показывает, какие заголовки и директивы конкретный location реально получит на выходе, а не что написано в файле буквально.

Отдать конфиг с реальными доменами, внутренними IP-адресами upstream-серверов и путями к SSL-сертификатам в облачный чат ради разбора одной непонятной директивы — решение так себе с точки зрения инфраструктурной гигиены, тем более что в конфиге часто рядом лежит basic auth или пути к секретным конфигурационным файлам. А сама механика наследования в nginx — это не общее правило "всё каскадом добавляется", а набор специфичных для каждой директивы исключений, который языковая модель бодро путает с CSS-каскадом, потому что интуитивно это выглядит похоже, а по факту работает иначе.

Анализатор разбирает вложенность http, server и location блоков, для каждой директивы применяет её конкретное правило наследования (полностью заменяется дочерней, накапливается построчно, или наследуется только при отсутствии переопределения), и выводит итоговый эффективный набор директив для каждого конкретного location — ровно то, что реально увидит запрос, дошедший до этого location.

Частые вопросы

Почему add_header пропадает в location, если он там уже используется хоть раз?

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

Какие директивы ведут себя так же, как add_header?

Похожая логика полной замены вместо накопления действует у ряда директив из модулей headers и proxy, например у некоторых вариантов proxy_set_header в определённых версиях, официальная документация nginx явно перечисляет такие директивы как контекстно-зависимые по наследованию, и это стоит проверять для конкретной директивы отдельно, а не считать общим правилом.

Может ли анализатор автоматически починить конфиг?

Нет, инструмент показывает, какой эффективный набор директив реально применяется к каждому location, решение о том, как переписать конфиг, чтобы получить желаемый результат, остаётся за вами — обычно достаточно продублировать нужные директивы явно внутри location, где они иначе потерялись бы.

Работает ли анализ для вложенных location внутри location?

Да, nginx поддерживает вложенные location в некоторых конфигурациях, анализатор рекурсивно проходит по всей вложенности и строит дерево наследования на любую глубину.

Учитывается ли include с внешними файлами конфигурации?

Инструмент анализирует именно тот текст, который вы вставили целиком, если реальный конфиг собирается из нескольких файлов через include, эти файлы стоит объединить в один текст перед анализом для получения полной и корректной картины.