nginx默认不校验后端证书有效期,仅在ssl握手失败时返回502/503;可通过proxy_next_upstream实现多实例重试,或用proxy_intercept_errors + error_page主动降级至兜底响应。

当后端 API 使用 HTTPS 通信,且其证书过期时,Nginx 作为反向代理默认会直接返回 502 Bad Gateway(因 SSL 握手失败)或 503 Service Unavailable(若配置了健康检查但上游不可达)。这不是 Nginx 主动“发现”证书过期,而是底层 OpenSSL 在建立 TLS 连接时抛出 handshake failure 错误,导致 proxy_pass 失败。真正的容错与降级,必须由 Nginx 主动拦截这类失败,并转向预设兜底策略。
为什么 Nginx 不会主动校验后端证书有效期?
Nginx 的 upstream SSL 客户端行为遵循标准 TLS 协议:它信任操作系统或指定的 CA 证书包(via proxy_ssl_trusted_certificate),但不主动解析、不校验后端证书的 NotBefore/NotAfter 时间字段。只要证书链可验证、域名匹配、签名有效,Nginx 就尝试握手;一旦握手失败(如证书过期、域名不匹配、签名无效),就终止连接并报错。
这意味着:你无法靠 Nginx 配置“提前拦截即将过期的后端证书”,只能应对已发生的握手失败。
基础容错:让 Nginx 自动切换可用上游
当某台后端服务器因证书过期导致 SSL 握手失败,Nginx 可通过 proxy_next_upstream 实现透明重试,前提是部署了多实例:
-
proxy_next_upstream error timeout http_502 http_503;—— 显式将 502/503 视为可重试条件 -
proxy_next_upstream_tries 3;—— 最多重试 3 次 -
proxy_next_upstream_timeout 10s;—— 总重试超时时间
⚠️ 注意:该机制仅在 upstream 块中定义多个 server 时生效。单点部署下无上游可切,此配置无效。
主动降级:拦截失败并返回兜底响应
这是更可靠的方式——不依赖上游是否“还有另一台能用”,而是直接接管失败流程,返回静态页、JSON 或跳转提示:
- 开启错误拦截:
proxy_intercept_errors on; - 绑定状态码:
error_page 502 503 = @api_fallback; - 定义内部 location:
location @api_fallback {
internal;
root /usr/share/nginx/html;
try_files /api-unavailable.json =404;
}
这样,任意后端因证书过期引发的 502/503,都会被静默替换为本地 /api-unavailable.json(如 {"code":5001,"msg":"service_temporarily_unavailable"}),状态码仍为 502 或 503(取决于原始错误),前端可据此统一处理。
增强可观测性:区分证书错误与其他故障
若需日志中明确标记“SSL handshake failed”,可配合 error_log 级别和自定义变量:
- 在
upstream中启用详细日志:proxy_ssl_verify off;(关闭严格校验,避免因证书问题直接阻断) +proxy_ssl_protocols TLSv1.2 TLSv1.3; - 添加日志记录:
log_format upstream_ssl '[$time_local] $upstream_addr SSL: $upstream_http_x_ssl_status'; - 在 proxy_pass 后注入标识头(需后端配合或用 Lua):
proxy_set_header X-SSL-Status "handshake_failed";
结合 Prometheus + nginx-module-vts 或 OpenResty 的 ssl handshake metrics,可对证书类失败做告警(例如:5 分钟内 502 率突增且集中在特定 upstream)。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











