Pull to refresh

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

Nginx
В связи с увеличением интереса к 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:nginxincludeвиртуальный хостинг
Hubs: Nginx
Total votes 7: ↑4 and ↓3 +1
Views4K

Comments 10

Only those users with full accounts are able to leave comments. Log in, please.

Popular right now

Junior full stack-разработчик (Perl)
from 80,000 ₽Гнездо.ру - платформа эффективной рекламыRemote job
Middle/Senior Backend developer
from 150,000 ₽CoveRemote job
Веб-девелопер
from 50,000 to 70,000 ₽MyMap24МоскваRemote job
PHP Developer
from 100,000 to 180,000 ₽WowVendorRemote job
Backend developer
from 100,000 to 250,000 ₽TravelLineRemote job

Top of the last 24 hours