证书失效需逐台验证各节点,统一用软链接+集中分发保障一致性,重载须滚动验证并配合健康检查,自动化续期需闭环同步至所有节点。

确认证书失效是否真实发生在所有节点
高可用环境通常由多台 Nginx 服务器组成(如主备、集群或负载均衡后端),证书失效可能只出现在部分节点。不能仅凭一个节点的现象下结论。应逐台登录每台服务器,执行以下检查:
- 用 openssl x509 -in /path/to/fullchain.pem -noout -dates 验证各自证书的 Not After 时间
- 核对 ssl_certificate 和 ssl_certificate_key 在各节点配置中指向的路径是否一致且文件存在
- 运行 curl -Iv https://yoursite.com --resolve yoursite.com:443:node-ip 绕过负载层,单独测试每个节点的 TLS 握手结果
统一证书分发与原子化更新
手动逐台替换容易遗漏或不一致。推荐使用软链接+集中分发方式保障一致性:
- 将新证书统一存放到共享存储(如 NFS)或通过 Ansible/Rsync 推送到所有节点的固定目录(如 /etc/nginx/ssl/live/your-domain/)
- 各节点 Nginx 配置中均引用符号链接(如 /etc/nginx/ssl/current.crt),而非具体时间戳文件名
- 更新时在每台机器上执行 ln -sf /etc/nginx/ssl/live/your-domain/fullchain.pem /etc/nginx/ssl/current.crt(同理处理私钥),确保单次操作完成
重载策略需适配高可用架构
简单执行 nginx -s reload 可能导致部分连接中断或旧证书残留,尤其在滚动更新场景下:
- 先在一台节点上执行 nginx -t && nginx -s reload,验证新证书生效且无错误日志
- 结合健康检查探针(如 location /health { return 200 "OK"; })确认服务就绪后再切流
- 若使用 Keepalived 或 LVS,建议配合 weight 调整或临时摘除节点再更新,避免用户请求落到未更新完成的实例
自动化续期必须跨节点同步触发
单点 Certbot 续期无法保证所有节点证书一致,必须设计闭环流程:
- 在证书管理节点部署 Certbot,续期成功后通过脚本自动分发新证书到全部 Nginx 节点
- 每个节点配置定时任务,但只负责重载:0 12 * * * /usr/bin/nginx -t && /usr/sbin/nginx -s reload
- 或使用 --deploy-hook:在主节点运行 certbot renew --deploy-hook "ansible all -m copy -a 'src=/etc/letsencrypt/live/... dest=/etc/nginx/ssl/' && ansible all -a '/usr/sbin/nginx -s reload'


















