Nginx 包含配置文件的顺序是固定的还是随机的?Apache明确指出通配符按字母顺序扩展。对于 Nginx,这似乎不适用,并且手册上没有提到这一点。
在我的设置中,20_example.com
之前已包含00_default
,这违背了我在那里定义共享指令(如日志格式)的目的。
答案1
根据nginx源代码它使用带有 GLOB_NOSORT 参数的 glob() 函数因此,无法清楚地确定文件包含的顺序。
这是2012 年 11 月更改,首次发布于 1.3.10。从变更文件:
现在,如果在 Unix 系统上使用带掩码的“include”指令,则包含的文件将按字母顺序排序。
答案2
历史答案;在 Nginx 1.3.10(2012 年 11 月)之前是正确的。
AD7six 的回答并不完全正确。当两个服务器块具有相同的“特异性”时,顺序也很重要,例如当它们都在 server_name 中使用正则表达式,并且传入请求与两者匹配时:
server {
server_name ~^(www\.)?(?<domain>foo\.com|bar\.com|baz\.com)$;
...
}
和
server {
server_name ~^(www\.)?(?<domain>.+)$;
...
}
在这种情况下,两个服务器块不能分布在两个文件中,因为无法保证它们的顺序。
答案3
正如 OP 指出的那样,log_format 顺序确实非常重要,在自定义 log_formats 的情况下,如果将两种类型的文件放在同一个目录中,一些文件带有 log_formats,一些文件带有使用这些 log_formats 的服务器块,结果将是高度不可重复的配置。
在工作中,当我们第一次将手工制作的 nginx farm 移到 puppet 中时,我们开始看到一些从头开始的 nginx 安装在相同的硬件/设置中失败,经过大量调试奇怪的情况,比如有两个 /etc/nginx/* (-r) 带有 md5match 和相同的二进制文件产生不同的结果(一个出现无效的 log_format 错误,另一个出现正常),我们学到了惨痛的经验教训秩序确实非常重要对于一些指令,如log_format。
我们通过将服务器块生成从 conf.d/* 移到 conf.d/* 之后的另一个文件夹中来解决了这个问题。
答案4
nginx -T
您可以通过将完整的连接文件转储到标准输出来检查两台机器上实际使用的合并配置文件是否相同。
这样您还可以查看包含的顺序是否是您所假设的顺序。