Последовательность выполнения директив конфигурационного файла nginx

К примеру у меня есть конструкция наподобии этой:

location /alpha {
  if (...) {
    ...
  }

  location /alpha/bravo {
    ...
  }
}

Должен ли сначала выполниться блок if, или вложенный location, или порядок выполнения не определен?


Ответы (1 шт):

Автор решения: Alexey Ten

Конфигурация 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-у вообще неважно.

→ Ссылка