Nginx的include指令是构建可维护大型配置体系的基础设施,需按功能分层组织目录、严格遵循作用域规则、统一使用绝对路径、显式控制加载顺序,并每次修改后执行nginx -t校验。

Nginx 的 include 指令不是“锦上添花”的语法糖,而是构建可维护大型配置体系的基础设施。关键不在能不能用,而在怎么组织路径、控制加载顺序、划分职责边界。
目录结构按功能分层,不按文件类型堆砌
把所有 .conf 文件塞进 conf.d/ 是懒人做法,容易演变成“谁改谁加”,最终无法定位某段逻辑来源。推荐明确划分目录职责:
-
upstreams/:只放upstream块,命名如auth-service.conf、payment-cluster.conf -
routes/:每个微服务或业务域一个location配置,如/routes/order-api.conf,内容仅含location /order { proxy_pass http://order-upstream; } -
snippets/:纯复用片段,不带上下文,例如snippets/proxy-params.conf(含proxy_set_header系列)、snippets/rate-limit.conf(含limit_req相关定义) -
security/:集中管理 IP 黑白名单、恶意 UA 过滤、CORS 策略等,避免在每个server块里重复写if ($bad_bot) { return 403; }
include 位置决定作用域,不能跨层混用
同一行 include 写在不同块里,效果完全不同:
- 在
http { }最外层(即http块开头)引入upstreams/*.conf:这些upstream对整个http块及其所有子server可见 - 在某个
server { }块内引入snippets/ssl.conf:该文件只能包含ssl_certificate、ssl_protocols等 server 级指令,不能出现upstream或log_format - 在
location /api { }中引入snippets/auth-header.conf:只影响这个 location,适合加特定 header 或鉴权逻辑
违反作用域规则会直接导致 nginx -t 报错,比如在 server 块里 include 一个含 map 的文件——map 必须在 http 块顶层声明。
路径写法统一用绝对路径,禁用模糊相对路径
像 include ./conf.d/*.conf 或 include ../shared/headers.conf 看似简洁,但实际依赖 Nginx 启动时的工作目录(pwd),而该目录可能随启动方式(systemd、手动执行、容器 entrypoint)变化。生产环境必须写死:
- ✅ 推荐:
include /etc/nginx/upstreams/*.conf; - ✅ 推荐:
include /etc/nginx/snippets/proxy-params.conf; - ❌ 避免:
include conf.d/*.conf;(相对路径,基准不确定) - ❌ 避免:
include ../snippets/*.conf;(上级跳转易出权限或路径错误)
路径写全后,nginx -t 报错信息也更明确,比如 “open() \"/etc/nginx/upstreams/missing.conf\" failed (2: No such file or directory)” 比 “open() \"./conf.d/xxx.conf\" failed” 更容易排查。
加载顺序隐含逻辑依赖,显式拆分比通配符更可控
虽然 include /etc/nginx/routes/*.conf; 看起来省事,但文件系统按字母序加载(01-auth.conf、02-order.conf),一旦依赖关系变复杂(比如某个 route 要引用提前定义的 map 变量),就容易踩坑。更稳妥的做法是:
- 全局级依赖(
map、log_format、limit_req_zone)单独放在/etc/nginx/conf.d/00-global.conf,并在http块最顶部include - 站点主配置按需显式引入,例如:
include /etc/nginx/sites/example.com.conf;,而不是靠通配符自动发现 - 临时调试可注释某一行
include,比删文件或重命名更安全
每次增删 include 行后,务必运行 nginx -t;建议把常用校验命令做成 alias,比如 alias nginx-test='sudo nginx -t -c /etc/nginx/nginx.conf'。


















