Skip to content
容器镜像与站点交付细节 · 第 5 篇 / 共 6 篇
领域运维与部署
专题容器与站点部署专题
当前序列容器镜像与站点交付细节
阅读位置第 5 篇 / 共 6 篇当前专题第 4 个序列 / 共 4 个序列

HTTPS 证书续期和自动化部署怎么衔接

这篇文章最容易混淆的地方在于:它其实是两条不同的链路。

  • 一条是站点内容发布链路
  • 一条是 HTTPS 证书续期链路

很多人把这两件事绑死在一起,结果后面不是发布变复杂,就是证书续期不稳定。

先说结论

  • 静态站点发布和 HTTPS 证书续期,最好拆成两条独立流程
  • 续期的核心不是“证书文件更新了”,而是“更新后 Nginx 已经重新加载”
  • 对你现在这类 Docker Nginx + VitePress 站点,更稳的做法是宿主机管理证书,容器只读挂载使用
  • 发布博客文章时,不应该依赖重新申请证书;续期证书时,也不应该顺手改站点内容

一、先把核心对象和链路串起来

放到你当前这套环境里,更推荐这样理解:

text
本地写文章 -> VitePress build -> rsync 到 /mydata/nginx/html/mumu-wiki -> Nginx 提供静态站点
域名解析 -> Certbot/acme.sh 申请证书 -> 证书文件更新 -> reload Nginx

这里最重要的一点是:

  • 发布链路主要影响站点内容
  • 证书链路主要影响 HTTPS 可用性

这两个动作可以同时存在,但不应该相互耦合。

二、工程判断不要只看单点

很多线上问题不是证书本身坏了,而是链路没衔接好。

常见有 3 种情况:

  • 证书已经续期成功,但 Nginx 没 reload,线上仍然是旧证书
  • 发布内容时顺手重建 Nginx,结果把证书挂载或配置搞错
  • 证书放在容器内部,容器一重建,续期和回滚都变麻烦

所以更稳的拆法是:

  • 证书文件放宿主机
  • Nginx 容器只负责读取证书
  • 证书续期后只做轻量 reload
  • 站点发布只同步静态文件,不碰证书流程

三、什么时候最容易踩坑

常见踩坑点往往不是“不知道”,而是:

  • 证书申请一次成功后,就以为后面不用管了
  • 只看 certbot renew 是否执行成功,不看线上实际证书是否已切换
  • 续期命令和 Nginx reload 没串起来
  • 容器重建后,证书路径、配置路径和挂载路径对不上

尤其对 Docker Nginx 场景,最值得提前确认的是:证书到底是在宿主机持久化,还是在容器内部临时存在。

四、放到当前这套站点,更推荐的结构

如果你现在站点目录是这套思路:

text
/mydata/nginx/conf.d
/mydata/nginx/html/mumu-wiki
/mydata/nginx/logs

那么 HTTPS 更推荐也按“宿主机持久化”思路来管。

一个常见做法是:

  • 宿主机上申请和续期证书
  • /etc/letsencrypt 只读挂载进 Nginx 容器
  • Nginx 配置里直接引用挂载后的证书路径

例如 Compose 里通常会有:

yaml
volumes:
  - /etc/letsencrypt:/etc/letsencrypt:ro

这类做法的价值是:

  • 容器升级和重建不会丢证书
  • 续期流程和站点发布流程天然解耦
  • 排障时可以直接在宿主机验证证书文件是否已更新

五、一个更稳的续期流程应该长什么样

推荐你把续期流程理解成固定的 4 步:

  1. 执行续期
  2. 判断是否真的有证书更新
  3. reload Nginx
  4. 验证线上证书是否已经生效

例如:

bash
certbot renew
docker exec nginx-mumu-wiki nginx -s reload

如果你不方便直接依赖容器内命令,也可以在宿主机通过 Nginx 所在方式执行 reload。核心不是命令形式,而是“续期之后一定要刷新 Nginx 对证书文件的加载”。

六、自动化时最容易忽略的验证动作

很多人把任务写进 cron 就觉得结束了,其实还差最后一步:验证。

至少建议补两个动作:

  • 定期执行 certbot renew --dry-run
  • curlopenssl 看线上实际证书

像你现在这类站点,可以直接从服务器本机验证:

bash
curl -k --resolve wiki.mumuxiaojia.site:443:127.0.0.1 https://wiki.mumuxiaojia.site/

这类验证的意义不是看页面内容,而是确认:

  • 443 正常响应
  • 证书链路没有因为配置变更失效
  • Nginx reload 后 HTTPS 入口仍然正常

七、发布链路为什么不要顺手重载证书流程

你现在的博客发布本质上是:

  • 本地构建
  • rsync/mydata/nginx/html/mumu-wiki

这一步通常只是在替换静态文件。

所以更稳的做法是:

  • 发布内容时不去碰证书目录
  • 发布内容时不重新申请证书
  • 除非改了 Nginx 配置,否则也不必每次都因为文章更新去折腾 HTTPS

这样链路边界更清楚,出问题也更好排。

八、常见误区

1. 把续期和发布写成一个大脚本

脚本看起来省事,但只要其中一个环节失败,排障就会变得更模糊。

2. 只关心证书文件,不关心 Nginx 是否已使用新证书

文件更新不代表线上已经切换成功。

3. 把证书放到容器内临时目录

容器一旦重建,续期和回滚都会更被动。

一句话总结

对个人知识库这类静态站点来说,HTTPS 续期和自动化发布最稳的衔接方式不是“全绑在一起”,而是把内容发布和证书续期拆开,各自自动化、各自验证。

延伸阅读相关文章优先当前专题,再补跨专题关联。
同一序列 · 顺着当前主线继续读反向代理 WebSocket 时最容易漏哪些配置适合把镜像分层、镜像瘦身、时区日志、静态缓存和 WebSocket 代理放进一条容器交付主线上看。容器与站点部署专题 · 容器镜像与站点交付细节同一序列 · 回看前文会更完整Nginx 静态站点缓存策略怎么设计适合把镜像分层、镜像瘦身、时区日志、静态缓存和 WebSocket 代理放进一条容器交付主线上看。容器与站点部署专题 · 容器镜像与站点交付细节同专题其他序列 · 共享标签:Nginx、部署交付Nginx 两个最常见的用法适合把容器基础、Compose、Dockerfile 和 Nginx 站点部署放在一组里连续看。容器与站点部署专题 · Docker 与 Nginx 部署同专题其他序列 · 共享标签:部署交付负载均衡、健康检查和会话保持怎么设计适合把 location 匹配、缓冲区和负载均衡放在一起看。容器与站点部署专题 · Nginx 进阶路由与代理治理跨专题关联 · 同场景:部署交付标签基数为什么会拖垮 Prometheus适合把 Prometheus、Grafana、标签治理和告警分级放在一起看。可观测性专题 · 指标与告警体系设计跨专题关联 · 同场景:部署交付多环境发布怎么设计:开发、测试、预发、生产不只是名字不同适合沿着流水线设计、自动部署、发布策略、数据库变更和多环境治理这条线往下读。CI/CD 与发布治理专题 · CI/CD 与发布治理
继续阅读容器镜像与站点交付细节当前序列第 5 篇 / 共 6 篇当前专题第 4 个序列 / 共 4 个序列
往前看
上一篇Nginx 静态站点缓存策略怎么设计回到当前序列上一章上一序列Nginx 进阶路由与代理治理从第 1 篇开始:location、rewrite、try_files 怎么一起理解
往后看
下一篇反向代理 WebSocket 时最容易漏哪些配置继续当前序列下一章下一序列CI/CD 流水线稳定性与发布治理从第 1 篇开始:流水线缓存为什么有时越配越慢

把零散经验整理成可查、可复用、可持续更新的企业级知识门户