nginx exporter 可通过 ssl_certificate_not_after 指标获取证书过期时间戳,配合 promql ceil((ssl_certificate_not_after - time()) / 86400) 计算剩余天数,需启用 --ssl.certificate-url 或 --ssl.certificate-file 参数,并建议添加 and ssl_certificate_not_after > 0 过滤无效值。

可以通过 Nginx Exporter 的 ssl_certificate_not_after 指标直接获取证书过期时间戳,再用 Prometheus 的函数换算成剩余天数。
确认 Nginx Exporter 已启用 SSL 指标
Nginx Exporter(如 nginxinc/nginx-prometheus-exporter)默认不采集证书信息。需满足两个前提:
- Exporter 启动时添加
--web.listen-address和--nginx.scrape-uri,并确保 Nginx 开启了stub_status(仅用于基本指标,SSL 不依赖它); -
关键点:Exporter 必须能主动检查证书——需配置
--ssl.certificate-file(本地路径)或--ssl.certificate-url(支持 HTTPS 站点的证书自动抓取); - 例如启动命令中加入:
--ssl.certificate-url https://example.com --ssl.insecure-skip-tls-verify(跳过中间证书校验,适合测试)。
在 Prometheus 中计算剩余天数
Exporter 会暴露 ssl_certificate_not_after{job="nginx", instance="...", common_name="example.com"},其值为 Unix 时间戳(秒级)。用 PromQL 转换为距今剩余天数:
ceil((ssl_certificate_not_after - time()) / 86400)
说明:
-
time()返回当前 Unix 时间戳(秒); -
86400是一天的秒数; -
ceil()向上取整,避免出现小数天(如 2.1 天显示为 3 天更直观); - 建议加
and ssl_certificate_not_after > 0过滤无效证书(如自签名失败、读取超时导致值为 0)。
告警与可视化建议
把计算结果用于监控和告警:
- 告警规则示例(剩余 ≤7 天触发):
ssl_certificate_not_after{job="nginx"} > 0 and on() ceil((ssl_certificate_not_after - time()) / 86400) - Grafana 中可建 Panel,用 Time series 或 Stat 面板展示各域名的
days_remaining; - 若多个域名共用一个证书(SAN),注意
common_name和subject_alternative_name标签,可用group by (common_name)聚合避免重复告警。
替代方案:用 Blackbox Exporter + probe_ssl_earliest_cert_expiry
如果不想在 Nginx Exporter 侧处理证书,也可用 Blackbox Exporter 的 HTTPS 模块:
- 配置
prober: https,target 填https://example.com; - 采集到
probe_ssl_earliest_cert_expiry(Unix 时间戳); - PromQL 同样用
ceil((probe_ssl_earliest_cert_expiry - time()) / 86400)计算; - 优势是无需访问 Nginx 服务器文件系统,适合云环境或证书由 LB 终结的场景。











