nginx 通过 include 实现环境隔离的核心是物理分离配置文件、符号链接切换 active.conf、精准在 http 块中引入,而非 if 判断;各环境配置独立定义域名、端口、证书路径、proxy_pass、缓存及日志,避免 include 路径错误、权限问题和变量动态解析。

Nginx 用 include 实现测试与生产环境配置隔离,核心是物理分离 + 符号链接切换 + 上下文精准引入,而不是在单个文件里写一堆 if 判断。这样既安全又可审计,部署时也不容易手抖改错。
用 include 拆分环境配置文件
把差异项(域名、端口、证书路径、代理目标、缓存策略)按环境写成独立文件,比如:
-
/etc/nginx/conf.d/env/dev.conf -
/etc/nginx/conf.d/env/test.conf /etc/nginx/conf.d/env/prod.conf
每个文件只包含 server 块及相关 location、proxy_pass、SSL 设置等,不包含 http 或 events 等全局指令。
主配置 nginx.conf 的 http 块里只写一句:
include /etc/nginx/conf.d/env/active.conf;
这个 active.conf 不是真实文件,而是一个指向当前环境配置的符号链接:
# 切换到测试环境 sudo ln -sf /etc/nginx/conf.d/env/test.conf /etc/nginx/conf.d/env/active.conf # 切换到生产环境 sudo ln -sf /etc/nginx/conf.d/env/prod.conf /etc/nginx/conf.d/env/active.conf
每次切换后执行 nginx -t && nginx -s reload 即可生效。
各环境配置需严格独立
-
监听地址与域名:test.example.com 和 app.example.com 必须分别绑定,不能共用
server_name -
SSL 证书路径:
ssl_certificate和ssl_certificate_key指向各自目录,如/etc/nginx/ssl/test/fullchain.pem -
后端代理目标:
proxy_pass http://127.0.0.1:8081;(测试) vsproxy_pass http://127.0.0.1:8082;(生产) -
缓存区域:
proxy_cache dev_cache;和proxy_cache prod_cache;对应不同proxy_cache_path -
日志路径:
access_log /var/log/nginx/test_access.log;与access_log /var/log/nginx/prod_access.log;分开
避免 include 常见陷阱
-
include路径必须是绝对路径,或相对于 Nginx 的--prefix(通常是/usr/share/nginx或/etc/nginx) - 不要在
server块里include含有http指令的文件,会报错 - 所有被 include 的文件权限需为
nginx用户可读(如chmod 644,chown root:root) - 不要用变量或
$env动态拼接 include 路径——Nginx 不支持运行时解析变量
配合 systemd 或脚本自动化切换
可以写一个轻量脚本 nginx-env:
#!/bin/bash sudo ln -sf "/etc/nginx/conf.d/env/$1.conf" /etc/nginx/conf.d/env/active.conf sudo nginx -t && sudo nginx -s reload && echo "Switched to $1"
运行 ./nginx-env prod 就能一键切生产,避免手动输错路径。
不复杂但容易忽略











