nginx按shell字典序加载/etc/nginx/conf.d/*.conf,后加载文件会覆盖同名指令或引发冲突;应使用数字前缀(如00-global.conf)控制顺序,并用ls -1v | sort -v和nginx -t验证实际加载逻辑。

排查 include 目录通配符乱序问题,关键不是“乱序”本身(Nginx 本身不保证 include /etc/nginx/conf.d/*.conf 中文件的加载顺序),而是确认实际生效的配置是否因文件名排序意外覆盖或冲突。
理解通配符加载的真实行为
Nginx 按照 shell 层面的字典序(ASCII 码顺序)展开通配符,例如:
-
00-default.conf→ 先加载 -
10-api.conf→ 后加载 -
99-admin.conf→ 最后加载
这意味着后加载的 server 块可能覆盖前加载的同端口同 server_name 配置(尤其在未设 default_server 时),或 map/upstream 定义被重复声明导致 nginx -t 报错。
检查当前实际加载的文件列表
运行以下命令,查看 Nginx 解析通配符后按什么顺序读取文件:
ls -1v /etc/nginx/conf.d/*.conf 2>/dev/null | sort -V
注意:使用 sort -V(版本排序)比普通 sort 更准确,能正确处理 10-api.conf 在 2-api.conf 之后。
再用 nginx -T 输出全部展开后的配置,搜索关键块(如 server { 或 upstream backend),确认它们出现的先后位置是否符合预期。
识别由加载顺序引发的典型问题
- 多个
server块监听同一listen 80且无default_server→ 实际生效的是字典序最后那个 - 两个文件都定义了同名
upstream app→nginx -t会报upstream "app" is duplicate - 一个文件里
map $host $env { ... }被后加载文件中同名map覆盖或冲突 → 行为异常但不报错,需人工核对nginx -T输出
主动控制顺序的实用做法
- 用数字前缀命名文件:
00-global.conf、10-common.conf、90-site-a.conf - 避免在多个 include 文件中重复定义全局指令(如
client_max_body_size、log_format) - 把必须优先生效的配置(如默认 server、基础变量)放在
nginx.conf的http块内,而非依赖 include - 对关键逻辑(如
upstream、map)只定义一次,通过注释明确归属文件











