现场是这样的。acme.sh 显示续签成功,证书文件日期也是当天,浏览器访问正常,但服务器日志里蜘蛛的 TLS 握手仍在报 certificate expired,持续了整整一天。
把日志和配置对完,能解释这个现象的基本就这几处。Nginx 只在启动时读取证书,文件换了进程没重载;证书路径用了软链接,续签后链接指向变了但 inode 没更新;多台后端只重载了一台,负载均衡把蜘蛛分到旧节点。
先看进程实际加载的证书有效期
echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null | openssl x509 -noout -dates
接着重载配置让新证书生效
nginx -t && systemctl reload nginx
等前面都确认过,再逐台确认证书一致
for h in 10.0.0.1 10.0.0.2; do echo | openssl s_client -connect $h:443 2>/dev/null | openssl x509 -noout -enddate; done
报错是间歇性的,我蹲守了半小时才抓到一次完整现场。
怎么算真的好了,看的是同一批现象。重载后握手恢复正常,日志里证书过期告警消失,蜘蛛抓取成功率回到 99% 以上。
续签脚本只负责换文件,重载这一步漏了,等于白续一次,监控要盯握手而不是文件时间。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
