Nginx 配置与项目部署解耦:envsubst + 独立 Workflow

543 字
3 分钟
Nginx 配置与项目部署解耦:envsubst + 独立 Workflow

问题#

博客的 nginx 一直跑着官方默认配置——Gzip 没开、安全头没有、缓存策略全无。更麻烦的是,nginx 配置和博客内容耦合在同一个部署流程里:

deploy-server.yml: pnpm build → SCP dist/ → docker run

想改个缓存时间?得改项目代码、走完整构建、等 CI/CD 跑完。改完容器重启,配置又丢了(无状态容器)。

方案:四层解耦#

1. 模板 + envsubst#

仓库是公开的,敏感信息(域名/IP)不能明文存。用 envsubst 做模板变量替换:

server/nginx/default.conf.template
server {
server_name ${BLOG_DOMAIN};
# ...
}

CI/CD 中替换后上传:

- run: envsubst '${BLOG_DOMAIN}' < template > default.conf

envsubst '${BLOG_DOMAIN}' 精确替换指定变量,nginx 自身的 $ 变量(如 $remote_addr)不受影响。

GitHub Secrets 里存 BLOG_DOMAIN,仓库里只有模板,不留明文。

2. 独立 Workflow#

新增 .github/workflows/deploy-nginx.yml,只做一件事:

手动触发 → envsubst → SCP default.conf → nginx -t 测试 → nginx -s reload

和博客内容部署完全独立:

改 nginx 配置 → 编辑模板 → 手动触发 Deploy Nginx Config → 10 秒生效
改博客内容 → git push → Deploy to Server 自动触发 → 3 分钟

3. 条件挂载#

博客部署时检测配置文件是否存在:

Terminal window
CONFIG_MOUNT=""
if [ -f /path/to/conf/default.conf ]; then
CONFIG_MOUNT="-v /path/to/conf/default.conf:/etc/nginx/conf.d/default.conf:ro"
fi
docker run -d --name myFireflyBlog \
-v /path/to/dist:/usr/share/nginx/html:ro \
$CONFIG_MOUNT \
-p 80:80 --restart always nginx:alpine

配置存在则挂载,不存在则退化到默认配置——零耦合故障点。

4. 配置与内容目录分离#

服务器上配置文件和静态文件分开放:

/path/to/blog/
├── dist/ # 博客静态文件(SCP 上传)
├── conf/
│ └── default.conf # nginx 配置(独立 workflow 管理)

两个目录互不覆盖,内容 deploy 不会丢配置,配置更新不影响内容。

结果#

操作之前之后
改缓存策略改代码 → push → 等 3 分钟构建改模板 → 触发 workflow → 10 秒 reload
改博客内容同上流程git push → 自动部署(不影响配置)
回滚配置无解git revert → 触发 workflow
服务器重建手配 nginx跑 workflow 一键恢复

最直接的收益:改 nginx 配置从”半小时的项目发布”变成了”10 秒的运维操作”。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Nginx 配置与项目部署解耦:envsubst + 独立 Workflow
https://www.sanyablog.cn/posts/nginx-config-separation-practice/
作者
Sanya
发布于
2026-07-15
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Sanya
Hello, I'm Sanya.
公告
本博客为 Vibe Coding 试验田 —— 所有文章、功能、设计均由 AI 辅助编程完成。这里记录着我的探索与踩坑,欢迎一起交流。
分类
标签
站点统计
文章
11
分类
4
标签
41
总字数
12,441
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录

hi~请问有什么问题吗?