envsubst 可动态替换 nginx 配置中 $nginx_port 等环境变量,生成临时配置后重载,适用于 docker/k8s;需用 $var 格式写模板、安装 gettext、确保权限正确。
用 envsubst 动态替换 nginx 监听端口,核心是把配置中的占位符(如 $nginx_port)在启动时替换成真实值,适合 docker、k8s 或脚本化部署场景。它不修改原始配置文件,而是生成临时配置再加载,安全且可复用。
准备带变量的 Nginx 配置模板
在站点配置中(例如 /etc/nginx/conf.d/app.conf.template),用 shell 变量语法写 listen 行:
-
listen $NGINX_PORT;(HTTP) -
listen $NGINX_SSL_PORT ssl;(HTTPS) - 确保其他依赖变量也统一命名,如
$BACKEND_URL、$CERT_PATH
运行 envsubst 替换并加载
执行替换后写入正式配置,再重载 Nginx:
- 导出环境变量:
export NGINX_PORT=8080 - 执行替换:
envsubst /etc/nginx/conf.d/app.conf - 验证语法:
nginx -t - 平滑重载:
nginx -s reload
配合 Docker 使用更典型
Dockerfile 或 docker-compose.yml 中可自动完成该流程:
- 启动命令写成:
sh -c "envsubst /etc/nginx/conf.d/app.conf && nginx -g 'daemon off;'" - 通过
-e NGINX_PORT=8000启动容器,端口即动态生效 - 无需重建镜像,不同环境只需改环境变量
注意事项与常见问题
避免因格式或权限导致替换失败:
- 模板文件中变量必须用
$VAR或${VAR}格式,不能写成$$VAR或漏掉$ - 确保
envsubst已安装(Ubuntu/Debian:安装gettext-base;Alpine:安装gettext) - 替换后的配置文件需有正确权限(如
nginx:nginx可读),否则nginx -t会报错 - 若使用 HTTPS,记得同时替换
ssl_certificate和ssl_certificate_key路径中的变量











