Pull to refresh

мини-грабельки с include и виртуальным хостом по-умолчанию

Reading time 1 min
Views 5K
В связи с увеличением интереса к nginx в том числе и в среде Linux хочу напомнить об одной незаметной потенциальной грабле с виртуальными хостами и хостом по-умолчанию, на которую довольно больно наступать.

Обратимся к документации по директиве listen:
Если у директивы есть параметр default, то сервер, в котором описана эта директива, будет сервером по умолчанию для указанной пары адрес: порт. Если же директив с параметром default нет, то сервером по умолчанию будет первый сервер, в котором описана пара адрес: порт

А теперь посмотрим в конфиг по-умолчанию, который поставляется в некоторых дистрибутивах Linux:
...
include /etc/nginx/sites-enabled/*;
...

Ничего подозрительного, верно? Посмотрим на конфигурацию сервера по-умолчанию, который лежит в файле default:
...
listen   80;
...

Тоже, вроде, никакого криминала. А вот теперь самое время рассказать о грабле — директива include не гарантирует, что включенные файлы будут отсортированы в каком-либо определенном порядке, т.к. обработка директивы include включает в себя вызов ngx_open_glob(...), который вызывает glob(pattern, GLOB_NOSORT, ...) — естественно, лишняя сортировка отключена для того, чтоб не тратить на неё драгоценные кванты времени. Но при этом у директивы listen явного флага default не стоит, таким образом можно получить весьма неожиданное поведение.

Замечательно, что даже в таких мелочах сервер остаётся верен идее максимальной производительности, но будте аккуратны — скальпель остр и может неожиданно выстрелить в ногу!
Tags:
Hubs:
+1
Comments 10
Comments Comments 10

Articles