Nginx 无内置证书过期监控,需通过外部脚本+定时任务实现:定期用 OpenSSL 提取证书有效期、计算剩余天数,按阈值触发邮件/企业微信告警、记录日志;脚本需支持多域名、防重复告警、权限校验及错误处理。

Nginx 本身不提供证书到期监控或告警功能,所有提醒都必须通过外部脚本配合系统定时任务来实现。核心是定期读取证书信息、计算剩余天数、按阈值触发通知,并记录日志便于追踪。
提取证书有效期并计算剩余天数
SSL 证书通常存放在 /etc/nginx/ssl/ 目录下(如 example.com.crt),可用 OpenSSL 命令直接解析:
-
openssl x509 -in /etc/nginx/ssl/example.com.crt -noout -enddate查看过期时间字符串 -
date -d "$(openssl x509 -in /etc/nginx/ssl/example.com.crt -noout -enddate | cut -d'=' -f2-)" +%s转为 Unix 时间戳 - 用当前时间戳减去过期时间戳,再除以 86400,得到剩余天数(整数)
编写可执行的检查与告警脚本
新建脚本(如 /usr/local/bin/check-ssl-alert.sh),支持多域名和多种通知方式:
- 设定预警阈值(例如 30 天、15 天、7 天),低于任一阈值即触发动作
- 检查证书文件是否存在,避免因路径错误导致静默失败
- 支持邮件通知:
echo "证书将在 $days_left 天后过期" | mail -s "SSL 过期预警" admin@example.com - 支持企业微信告警:用
curl -X POST向机器人 Webhook 发送 JSON 消息(含域名、剩余天数、过期时间) - 写入本地日志:
echo "$(date): WARNING - example.com expires in $days_left days" >> /var/log/nginx/cert_alert.log
配置定时任务每日自动运行
使用 cron 确保每天检查一次,推荐凌晨低峰时段执行:
- 编辑 root 的 crontab:
crontab -e - 添加一行:
0 3 * * * /usr/local/bin/check-ssl-alert.sh >/dev/null 2>&1(每天凌晨 3 点运行) - 确保脚本有执行权限:
chmod +x /usr/local/bin/check-ssl-alert.sh - 确认运行用户(如 root)对证书文件有读取权限(
ls -l /etc/nginx/ssl/)
增强稳定性的实用技巧
避免漏报或重复告警,可加入以下逻辑:
- 用临时文件(如
/tmp/ssl_alerted_example.com)标记已发过告警的域名,防止每天重复推送 - 若使用 Let's Encrypt,可将检查脚本作为
deploy-hook集成进 certbot 续签流程,只在证书更新后检查新证书 - 同时检查本地文件和远程端口(
openssl s_client -connect example.com:443),覆盖 CDN 或负载均衡场景 - 脚本开头加
set -e和错误捕获,证书损坏或命令失败时仍能输出日志


















