签发的是 90 天免费证书,续签脚本的 cron 写在容器内,容器重建后任务丢了。周日凌晨证书过期,百度抓取诊断里直接报证书已过期。
这类报错背后常见的原因有几处,逐个排除就行。续签任务依赖容器内的 crontab,重建即丢失;到期监控只探首页状态码,没有校验证书有效期;续签成功后没有触发 reload,Nginx 仍在用内存里的旧证书;裸域与 www 共用一张证书,监控只覆盖了 www。
直接看到期时间与剩余天数
echo | openssl s_client -connect www.lu0.cn:443 2>/dev/null | openssl x509 -noout -dates
然后把续签挂到宿主机 cron 并带重载钩子
0 3 * * * docker exec nginx certbot renew --quiet --deploy-hook 'nginx -s reload'
接着加一条十四天预警进巡检
echo | openssl s_client -connect www.lu0.cn:443 2>/dev/null | openssl x509 -checkend 1209600 -noout
裸域单独复检一次
echo | openssl s_client -connect lu0.cn:443 2>/dev/null | openssl x509 -noout -enddate
命令输出我都留了记录,免得改完记不清原来的值。
改完先别撤,确认这几项。巡检在到期前十四天开始每天告警一次,续签后自动重载生效,剩余天数稳定在六十天以上。
这里还有个坑。deploy-hook 比事后手动重载可靠,热加载漏一次就等于白续,服务端还在往外吐旧证书。这类问题最好一次改到位,反复小改反而容易把原因搅混。
