最高效方式是用 envsubst 模板 + 环境变量驱动实现一次构建、多环境运行:全局/服务级/条件片段模板分层设计,语义化命名环境变量(如 APP_ENV、BACKEND_API_URL),Docker 启动时自动渲染并运行 Nginx。

用 Docker 部署 Nginx 时,多环境配置(如 dev/staging/prod)最高效的方式不是复制多份配置文件,而是靠 envsubst 模板 + 环境变量驱动 实现一次构建、多环境运行。核心在于把“变”的部分抽成变量,启动时动态注入。
模板结构要清晰,按层级组织
把配置拆成可复用的层级,避免重复和硬编码:
-
全局模板:放在
/etc/nginx/templates/nginx.conf.template,定义 worker 进程、日志格式、MIME 类型等不变项 -
服务级模板:如
/etc/nginx/templates/default.conf.template,含server_name、listen、proxy_pass等需随环境变化的字段 -
条件片段(可选):比如 SSL 配置单独成
ssl.conf.template,通过环境变量控制是否启用(SSL_ENABLED=true)
环境变量命名要有业务语义
别用模糊名如 HOST 或 PORT,而是结合场景明确含义:
-
APP_ENV=staging—— 区分环境,用于日志前缀或健康检查路径 -
BACKEND_API_URL=https://api-staging.example.com—— 直接对应 proxy_pass -
FRONTEND_DOMAIN=app.staging.example.com—— 替换server_name -
NGINX_PORT=8080—— 支持非标端口,避免改模板逻辑
这样在 CI/CD 中只需替换 env 文件或 pipeline 参数,无需碰模板内容。
启动时自动渲染,不依赖手动 reload
Docker 官方镜像和 nginx-le 等增强版都内置了 entrypoint 脚本,在容器启动第一阶段就执行 envsubst:
- 脚本默认扫描
/etc/nginx/templates/*.template - 输出到
/etc/nginx/conf.d/(覆盖原有 conf 文件) - 完成后才真正执行
nginx -g "daemon off;"
你只需确保挂载对模板目录,并传入正确环境变量,整个流程全自动。不需要进容器执行 nginx -s reload,也不用写额外 shell 脚本。
配合 docker-compose 实现环境隔离
不同环境用不同 compose 文件,只差 environment 和 volumes:
-
docker-compose.staging.yml:挂载 staging 模板,设置BACKEND_API_URL指向预发后端 -
docker-compose.prod.yml:挂载相同模板,但启用SSL_ENABLED=true和证书卷 - 共用同一镜像,避免因镜像差异引入环境不一致问题


















