Последовательность выполнения директив конфигурационного файла nginx
К примеру у меня есть конструкция наподобии этой:
location /alpha {
if (...) {
...
}
location /alpha/bravo {
...
}
}
Должен ли сначала выполниться блок if, или вложенный location, или порядок выполнения не определен?
Ответы (1 шт):
Конфигурация nginx это не «программа» которая выполняется сверху вниз. Порядок директив в общем случае не влияет на порядок обработки запроса. За редким исключением, самое важное из которых модуль mod_rewrite в котором, в частности, и определена директива if (а так же rewrite и ещё парочка). Но даже в этом случае порядок в конфигурации влияет только на директивы из этого модуля.
Т.е.
set $a 1;
if ($a) { ... }
и
if ($a) { ... }
set $a 1;
выполнятся по разному, но
proxy_pass http://upstream;
if ($a) { ... }
и
if ($a) { ... }
proxy_pass http://upstream;
для nginx ничем не отличаются.
Далее, nginx обрабатывает запрос по фазам и каждая директива относится к какой-то фазе. Директива location обрабатывается в фазе поиска блока (NGX_HTTP_FIND_CONFIG_PHASE) в котором надо обрабатывать запрос, а if в фазе rewrite (NGX_HTTP_REWRITE_PHASE) найденного блока.
Т.е. в вашем примере всегда сначала «выполнится» location и если был запрос на /alpha/bravo, то директива if не выполниться вообще, т.к. запрос обрабатывается блоком location /alpha/bravo, а не блоком location /alpha.
Если запрос был по адресу /alpha/charlie, то if выполниться, а что там внутри location /alpha/bravo nginx-у вообще неважно.