nginx 默认不重试上游ssl握手失败,需显式配置proxy_next_upstream error、合理超时及节点健康检查才能触发重试;关键包括proxy_connect_timeout ≥7s、proxy_next_upstream_tries ≤3、server max_fails=2 fail_timeout=20s,并保持proxy_ssl_verify on以确保失败暴露为可重试error。

当上游后端偶发 SSL 握手失败(如证书临时过期、TLS 版本不匹配、OCSP 响应超时等),Nginx 默认不会重试——因为这类失败在协议层面表现为 SSL_do_handshake() failed 或 SSL_connect() failed,属于底层连接异常,归类为 error 类型,但需确保配置显式启用且环境支持。
确认 SSL 握手失败被识别为 error
Nginx 将以下情况统一视为 error 并可触发 proxy_next_upstream:
- TCP 连接建立成功,但在 TLS 握手阶段失败(如证书校验失败、ALPN 协商失败、密钥交换中断)
- SSL_read()/SSL_write() 返回错误且无有效响应头
- 后端关闭连接前未发送完整 TLS Finished 消息
⚠️ 注意:若使用 proxy_ssl_verify off 或跳过证书验证,部分握手失败可能被静默吞掉或降级为 502;建议保持 proxy_ssl_verify on 并配好 proxy_ssl_trusted_certificate,让失败暴露为明确 error,才能进入重试流程。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
基础配置必须包含 error + 合理超时
仅写 proxy_next_upstream error 不够——还需配套控制连接与 SSL 层行为:
-
proxy_next_upstream error;—— 必须显式声明,启用对所有 network-level error 的重试 -
proxy_connect_timeout 7s;—— 建议设为 5–10 秒,覆盖 TCP 握手 + SSL 握手耗时(尤其高延迟或 OCSP 查询场景) -
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 统一后端 TLS 版本,减少协商失败概率 -
proxy_ssl_ciphers ...;—— 避免使用已弃用或后端不支持的 cipher suite
限制重试范围,防止误漂移
SSL 握手失败通常是瞬时或节点级问题(如某台机器证书加载异常),不是全量故障。需避免过度重试:
-
proxy_next_upstream_tries 3;—— 最多尝试 3 个节点(含首次),适合 ≥2 台主节点的 upstream -
proxy_next_upstream_timeout 12s;—— 总耗时上限,应 ≥proxy_connect_timeout × 2,但不超过 15 秒,防止用户等待过久 - 上游中每个 server 必须带
max_fails=2 fail_timeout=20s—— 连续 2 次 SSL 握手失败即剔除 20 秒,避免反复打同一异常节点
验证是否真正生效
不要只看配置语法,动手验证更可靠:
- 临时在某台后端上替换为自签名/过期证书,或用
openssl s_server -cert bad.crt模拟握手失败 - 用
curl -v https://your-domain/api/test触发请求,观察响应时间是否稳定在proxy_connect_timeout附近(如 7s),而非卡住或报 502 - 查 Nginx error log:
SSL_do_handshake() failed (SSL: ...)出现后,应紧随一条upstream prematurely closed connection while reading response header from upstream或直接切换到下一节点的日志










