nginx多环境配置应按“环境+职责”双维度组织,统一置于/etc/nginx/conf.d/env/{dev,test,prod}/,通过精确include路径加载,解耦通用配置与环境差异,并支持原子化切换和ci校验。

要实现 Nginx 多环境配置的标准化分离,关键不是堆砌目录,而是建立清晰、可维护、可自动化部署的结构逻辑。核心是按“环境+职责”双维度组织,避免混杂,同时确保 Nginx 能稳定加载且不冲突。
明确环境目录层级与位置
推荐将环境配置统一放在 /etc/nginx/conf.d/ 下,并按环境分层命名:
- /etc/nginx/conf.d/env/:作为环境配置根目录
- 其下创建子目录:
dev/、test/、prod/,每个目录存放该环境专属的 server 块或全局覆盖项(如日志路径、错误页、健康检查端点) - 主配置文件
nginx.conf中用include conf.d/env/prod/*.conf;(生产)等精确路径加载,而非通配符,防止误加载
功能配置与环境配置解耦
环境差异通常集中在监听端口、后端地址、证书路径、日志级别等,这些不应写死在 server 块里,而应通过变量或独立配置注入:
- 在 /etc/nginx/conf.d/ 下设
upstreams.conf(定义所有 upstream)、ssl.conf(含通用 TLS 参数),供各环境复用 - 环境专用配置只保留差异项,例如
/etc/nginx/conf.d/env/prod/upstream_backend.conf可覆盖upstream api_backend的 server 地址,其他参数继承自全局upstreams.conf - 使用
env指令(需编译时启用--with-http_realip_module)或通过 systemd 环境变量传递标识,配合 map 模块做条件路由(如开发环境允许 CORS,生产禁用)
启用机制必须可控且可验证
不能靠手动改 include 路径切换环境,应设计为原子化启停:
- 在 /etc/nginx/sites-enabled/ 下不直接放 conf 文件,而是放符号链接,指向
/etc/nginx/conf.d/env/prod/或/etc/nginx/conf.d/env/dev/中的启用入口文件(如main.conf) - 提供脚本一键切换:
sudo nginx-switch-env prod,该脚本清理旧链接、重建新链接、执行nginx -t并 reload - 每次变更后必须运行
nginx -T(大写 T)输出完整展开配置,人工或 CI 检查是否意外引入重复server_name或覆盖了关键指令
容器化部署时适配宿主机结构
若用 Docker 运行 Nginx,目录映射需对齐逻辑,而非简单复制路径:
- 宿主机使用 /data/dockerData/nginx/conf/ 作为挂载根目录
- 其下结构同步为:
conf/env/dev/、conf/env/prod/、conf/common/(含 logging、gzip、security 等通用设置) - Dockerfile 中指定
include /etc/nginx/conf/env/prod/*.conf;,并通过-v /data/dockerData/nginx/conf:/etc/nginx/conf挂载,确保容器内路径与宿主机语义一致 - CI 流水线构建镜像前,用 Ansible 或 shell 脚本校验
conf/env/*/下是否存在同名 server 块文件,避免多环境配置冲突











