В связи с увеличением интереса к nginx в том числе и в среде Linux хочу напомнить об одной незаметной потенциальной грабле с виртуальными хостами и хостом по-умолчанию, на которую довольно больно наступать.
Обратимся к документации по директиве listen:
А теперь посмотрим в конфиг по-умолчанию, который поставляется в некоторых дистрибутивах Linux:
Ничего подозрительного, верно? Посмотрим на конфигурацию сервера по-умолчанию, который лежит в файле default:
Тоже, вроде, никакого криминала. А вот теперь самое время рассказать о грабле — директива include не гарантирует, что включенные файлы будут отсортированы в каком-либо определенном порядке, т.к. обработка директивы
Замечательно, что даже в таких мелочах сервер остаётся верен идее максимальной производительности, но будте аккуратны — скальпель остр и может неожиданно выстрелить в ногу!
Обратимся к документации по директиве listen:
Если у директивы есть параметр default, то сервер, в котором описана эта директива, будет сервером по умолчанию для указанной пары адрес: порт. Если же директив с параметром default нет, то сервером по умолчанию будет первый сервер, в котором описана пара адрес: порт
А теперь посмотрим в конфиг по-умолчанию, который поставляется в некоторых дистрибутивах Linux:
...
include /etc/nginx/sites-enabled/*;
...
Ничего подозрительного, верно? Посмотрим на конфигурацию сервера по-умолчанию, который лежит в файле default:
...
listen 80;
...
Тоже, вроде, никакого криминала. А вот теперь самое время рассказать о грабле — директива include не гарантирует, что включенные файлы будут отсортированы в каком-либо определенном порядке, т.к. обработка директивы
include
включает в себя вызов ngx_open_glob(...)
, который вызывает glob(pattern, GLOB_NOSORT, ...)
— естественно, лишняя сортировка отключена для того, чтоб не тратить на неё драгоценные кванты времени. Но при этом у директивы listen
явного флага default не стоит, таким образом можно получить весьма неожиданное поведение.Замечательно, что даже в таких мелочах сервер остаётся верен идее максимальной производительности, но будте аккуратны — скальпель остр и может неожиданно выстрелить в ногу!