nginx多环境配置核心是“配置分离+路径隔离+环境变量驱动”:通过include拆分dev/staging/prod专属conf、map动态映射root路径、ci构建时模板替换或systemd注入环境变量,实现按需加载与运行时路由,辅以日志/权限/缓存隔离。

为不同环境(如开发、测试、预发、生产)配置多套子目录,核心是“配置分离 + 路径隔离 + 环境变量驱动”,不是靠硬编码写死路径,而是让 Nginx 在加载时能按需挂载对应环境的根目录和行为逻辑。
用 include 拆分环境专属配置块
在 /etc/nginx/conf.d/ 下创建环境分组目录,例如:
- conf.d/environments/dev.conf:定义 dev 环境的 server 块、root 路径、日志前缀、是否开启 debug 日志等
- conf.d/environments/staging.conf:启用 HTTPS、限制 IP 访问、连接后端 staging API 地址
- conf.d/environments/prod.conf:关闭文件列表、启用 Gzip、设置严格安全头、使用真实域名
然后在主 nginx.conf 的 http 块末尾加入:
这样启动时只加载当前需要的那一个 —— 实际部署时可通过软链接或部署脚本切换,比如:
rm -f /etc/nginx/conf.d/environments/current.confln -s /etc/nginx/conf.d/environments/prod.conf /etc/nginx/conf.d/environments/current.conf
用 map 指令动态映射 root 路径
如果所有环境共用一个 server 块(比如都监听 80 端口),但希望根据请求头或域名自动选子目录,可用 map 指令做运行时路由:
map $host $env_root {default "/var/www/default";
dev.example.com "/var/www/dev";
staging.example.com "/var/www/staging";
prod.example.com "/var/www/prod";
}
再在 server 块中引用:
listen 80;
server_name ~^(?
root $env_root;
index index.html;
}
这样无需重启 Nginx,改 DNS 或 Host 即可切环境,适合前端联调或灰度发布。
用变量 + env 模块注入构建时路径
若你用 CI/CD 构建(如 Jenkins/GitLab CI),可在启动 Nginx 前把环境标识注入系统环境变量,再通过 env 模块让 Nginx 读取(需编译时启用 --with-http_realip_module 和自定义模块支持,或用 systemd 传参):
- 在 systemd service 文件里加:
Environment="NGINX_ENV=prod" - 在 nginx.conf 中用
env NGINX_ENV;声明可读变量 - 再配合 Lua 或 OpenResty 的
set_by_lua_block动态拼接 root 路径(进阶用法)
更轻量的做法是:CI 构建阶段用模板工具(如 envsubst、sed)生成最终 conf,把 $ENV_ROOT 替换为实际路径,再推送到目标机器。
子目录级权限与日志隔离
每个环境子目录不只是放代码,还要独立控制访问和可观测性:
- 日志路径带环境名:
access_log /var/log/nginx/dev_access.log; - 禁止列出目录:
autoindex off;放在每个 server 或 location 块内 - 敏感路径拦截:
location ~ ^/(config|node_modules|\.git) { return 403; } - 静态资源加版本前缀或 hash,避免缓存混淆
不复杂但容易忽略。











