nginx 通过 include 指令结合符号链接实现多环境配置动态切换:主配置固定 include 绝对路径的 active.conf(软链接),该链接指向 dev/staging/prod.conf 等差异配置文件,运维用 ln -sf 切换链接目标后重载即可,配置隔离、可版本化且无需修改主配置。

Nginx 本身不支持运行时环境变量或条件加载,但可以通过 include 指令 + 文件系统机制(如符号链接)实现“动态组合”多环境配置的效果。关键不是让 Nginx 自动识别环境,而是由运维人员或脚本控制它实际加载哪一套配置。
核心逻辑是:主配置固定不变,只 include 一个路径;该路径指向一个软链接,链接目标随环境切换而改变。
主配置中用 include 指向可变入口
在 nginx.conf 的 http 块内(或其他合适作用域),写一行明确的 include:
http {
# ... 其他通用配置(mime.types、log_format、upstream 公共定义等)
include /usr/local/etc/nginx/environments/active.conf;
}
注意:
- 路径必须是绝对路径(推荐);
-
/usr/local/etc/nginx/environments/active.conf不是一个真实文件,而是一个符号链接; - 它会被指向
dev.conf、staging.conf或prod.conf中的一个。
环境配置文件按需拆分,保持独立
每个环境配置文件只放差异项,比如:
-
dev.conf:监听localhost:8080,proxy_pass 到本地开发服务,关闭 access_log,启用 debug header; -
staging.conf:监听staging.example.com,proxy_pass 到测试集群,开启详细日志; -
prod.conf:启用 SSL、HSTS、缓存策略,proxy_pass 指向生产上游,禁用调试信息。
这些文件都放在同一目录下(如 /usr/local/etc/nginx/environments/),内容仅包含 server 块、upstream 块或 map 等合法上下文内的指令,不包含 http { } 外壳。
用符号链接实现“切换”,无需改 nginx.conf
执行一次命令即可切换环境:
# 切到开发环境 ln -sf dev.conf /usr/local/etc/nginx/environments/active.conf # 切到生产环境 ln -sf prod.conf /usr/local/etc/nginx/environments/active.conf
切换后只需重载 Nginx:
nginx -t && nginx -s reload
这样做的好处是:
- 主配置始终干净稳定,无 if 或环境判断;
- 切换动作原子、可逆、可脚本化;
- 支持与 launchd、systemd 或 CI/CD 流程集成(例如启动时自动设为 prod);
- 所有环境配置可 Git 版本管理,彼此隔离不干扰。
配合 include 通配符做更灵活的组合(进阶用法)
如果某环境需要叠加多个片段(如“prod + canary”),可再加一层间接:
# active.conf 内容示例(它本身是个普通文本文件,非链接) include /usr/local/etc/nginx/environments/prod.conf; include /usr/local/etc/nginx/environments/canary.conf;
此时 active.conf 是真实文件,由脚本生成或模板渲染,include 就能加载多个片段。这种方式适合灰度发布、A/B 测试等场景,但需确保片段间无指令冲突(如重复定义同名 upstream)。
注意事项要记牢
- include 的路径必须存在且 Nginx 进程有读取权限;
- 被 include 的文件语法必须完全正确,否则
nginx -t直接失败; - 不支持
${ENV}变量展开,所有路径和文件名必须静态; - 不要在
events或全局块里 includehttp或server块——作用域错位会报错; - macOS 上若用 Homebrew 安装 Nginx,主配置通常在
/usr/local/etc/nginx/nginx.conf,路径需对应调整。











