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, эти файлы стоит объединить в один текст перед анализом для получения полной и корректной картины.