nginx不支持https后端带证书校验的主动健康检查,但可通过被动检查、http健康探针、ssl透传和外部监控实现高可用;需配置max_fails/fail_timeout、/healthz端点、proxy_ssl_verify等,并监控证书有效期。

Nginx 本身不支持对 HTTPS 后端服务做带证书校验的主动健康检查,但可以通过组合被动检查、HTTP 健康探针、SSL 安全透传和外部监控,实现真正可用的持续可用性保障。关键不是“能不能检查 HTTPS”,而是“如何用最可靠的方式判断后端是否真能对外提供安全、有效、可信赖的服务”。
启用 upstream 被动健康检查(基础防线)
这是无需额外模块、开箱即用的最低保障:
- 在
upstream块中为每个后端节点设置max_fails=3 fail_timeout=30s - Nginx 会自动统计真实请求失败次数(如连接超时、502/504、SSL 握手失败等)
- 连续失败 3 次后,该节点被临时摘除,30 秒后重试,成功则恢复
- 优点是零侵入、无需后端改造;缺点是故障发现滞后,第一个用户请求可能失败
暴露并探测 HTTP 健康端点(推荐主动方案)
让后端在 HTTPS 端口(如 443)或独立 HTTP 端口(如 8081)提供 /healthz 接口,并返回 200 OK:
- 若后端支持 TLS 下的明文 HTTP 请求(如 Go net/http 或 Spring Boot Actuator),Nginx 可直接用
nginx_upstream_check_module主动探测:upstream api_backend { server 10.0.2.10:443; server 10.0.2.11:443; check interval=5 rise=2 fall=3 timeout=3 type=http; check_http_send "GET /healthz HTTP/1.1\r\nHost: api.example.com\r\n\r\n"; check_http_expect_alive http_2xx; } - 更稳妥的做法是后端额外监听一个非加密端口(如
:8081),专用于健康检查,避免 TLS 层干扰判断
*配置 proxyssl 参数确保通信可信(安全前提)**
即使做了健康检查,Nginx 到后端的 HTTPS 代理仍需严格校验证书,否则健康检查通过但业务请求因证书问题失败:
-
proxy_ssl_verify on;必须开启 -
proxy_ssl_trusted_certificate /etc/nginx/ssl/backend-ca.crt;指向后端服务所用 CA 的根证书(自签或内网 CA 必须包含) -
proxy_ssl_name "api.example.com";显式指定 SNI 主机名,匹配证书中的 SAN 字段 -
proxy_ssl_protocols TLSv1.2 TLSv1.3;禁用老旧协议,防止降级攻击
补充证书有效期监控(防患于未然)
Nginx 不检查证书过期时间,必须靠外部脚本定期扫描:
- 用
openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null | openssl x509 -noout -dates提取notAfter - 当剩余有效期
- 可结合 Prometheus + Blackbox Exporter 实现可视化与阈值告警
不复杂但容易忽略











