Nginx включает файлы конфигурации не в порядке?

12

Является ли порядок, в котором Nginx включает файлы конфигурации, фиксированным или случайным? Apache явно заявляет, что символы подстановки раскрываются в алфавитном порядке. С Nginx, похоже, это не относится, и в руководстве ничего об этом не сказано .

В мою настройку 20_example.comбыл включен ранее 00_default, что противоречит моей цели определения общих директив (например, форматы журналов) там.

Ян Фабри
источник

Ответы:

23

Согласно исходному коду nginx он использует функцию glob () с параметром GLOB_NOSORT , поэтому порядок включения файла не может быть четко установлен.

Это было изменено в ноябре 2012 года , впервые выпущено в 1.3.10. Из файла изменений :

теперь, если в системах Unix используется директива include с маской, включаемые файлы сортируются в алфавитном порядке.

Вадим
источник
3

Ответ AD7six не совсем правильный. Порядок также имеет значение, когда два серверных блока имеют одинаковую «специфику», например, когда оба используют регулярные выражения в имя_сервера, а входящий запрос соответствует обоим:

server {
    server_name ~^(www\.)?(?<domain>foo\.com|bar\.com|baz\.com)$;
    ...
}

и

server {
    server_name ~^(www\.)?(?<domain>.+)$;
    ...
}

В этом случае два серверных блока не могут быть распределены по двум файлам, поскольку их порядок не может быть гарантирован.

Rufo
источник
1

Как указывает OP порядок log_format, это действительно очень важно, в случае пользовательских log_formats, если вы поместите в один и тот же каталог оба типа файлов, некоторые файлы с log_formats, некоторые файлы с блоками серверов, которые используют эти log_formats, результатом будет крайне неповторимая конфигурация.

На работе, когда мы впервые перенесли нашу созданную вручную ферму nginx в puppet, мы начали видеть, что некоторые установки nginx с нуля дают сбой при одинаковом оборудовании / настройке, после множества странных отладочных ситуаций, таких как наличие двух / etc / nginx / * (- r) с помощью md5match и одного и того же двоичного файла, дающего разные результаты (недопустимая ошибка log_format в одном и работающая в другом), мы с трудом узнали, что порядок действительно очень важен для некоторых директив, таких как log_format.

Мы исправили проблему, просто переместив генерацию серверных блоков из conf.d / * в другую папку, включенную после conf.d / *.

доблесть
источник