Nginx 不支持在配置中直接引用环境变量;env 指令仅控制 worker 进程是否继承系统环境变量,且必须位于主配置顶层,不能用于 proxy_set_header 等指令的动态值。

Nginx 本身不支持在 http、events 或全局块中直接用 env 指令“引入”操作系统环境变量供配置文件其他地方(如 set、proxy_set_header)动态使用——env 指令的作用非常有限,仅用于**控制 worker 进程是否继承某个环境变量**,且必须出现在主配置的顶层(main context),不能嵌套在 http 等块内。
env 指令的真实作用:仅控制继承,不提供变量引用能力
env VAR_NAME; 或 env VAR_NAME=VALUE; 只影响 Nginx 启动后 fork 出的 worker 进程是否携带该环境变量。它不会把变量变成 Nginx 配置中的可引用符号(比如不能写 proxy_set_header X-Env-Value $VAR_NAME;)。Nginx 配置语言本身没有原生的环境变量插值语法。
- ✅ 正确用法(在 nginx.conf 最外层):
env NODE_ENV;→ 允许 worker 进程访问系统原有的NODE_ENV - ❌ 错误用法:
http { env NODE_ENV; ... }→env不允许出现在http块中,会报错"env" directive is not allowed here - ❌ 无法实现:
proxy_set_header X-Deploy-Stage $NODE_ENV;→ Nginx 不识别$NODE_ENV这种语法,配置会启动失败或静默忽略
替代方案一:启动时用 envsubst 预处理配置文件
这是最常用、最可靠的做法:在 Nginx 启动前,用 shell 的 envsubst 将配置模板中的 ${VAR} 替换为实际值。
- 准备模板文件
nginx.conf.template:... proxy_set_header X-Deploy-Stage ${DEPLOY_STAGE}; ... - 启动前执行:
envsubst /etc/nginx/nginx.conf && nginx -t && nginx -s reload - 确保容器或 systemd 服务中已设置好
DEPLOY_STAGE=prod等环境变量
替代方案二:用 Lua + lua-resty-env(需编译 Lua 支持)
如果已启用 ngx_http_lua_module,可通过 Lua 代码读取环境变量并注入响应头或变量:
- 安装 lua-resty-env
- 在配置中使用:
set_by_lua_block $deploy_stage { return os.getenv("DEPLOY_STAGE") or "unknown" };proxy_set_header X-Deploy-Stage $deploy_stage; - 注意:该方式依赖 Lua 运行时,增加复杂度,不适用于纯静态部署场景
替代方案三:用 systemd 或容器入口脚本生成配置
在服务管理层面动态生成最终配置,更可控、无需额外模块:
- systemd 示例(
/etc/systemd/system/nginx.service.d/env.conf):
[Service]<br> Environment="DEPLOY_STAGE=staging"<br> ExecStartPre=/usr/local/bin/gen-nginx-conf.sh
-
gen-nginx-conf.sh中用sed或cat 插入变量值 - Docker 中常配合
ENTRYPOINT脚本完成类似工作

















