开启 proxy_ssl_session_reuse on 可将 TLS 握手从 2–3 RTT 压缩至 1 RTT,建连延迟由 80–120ms 降至 20–40ms;必须在 upstream 块中配置,配合 keepalive、HTTP/1.1 长连接、SNI 一致及后端会话恢复支持,并通过 $upstream_ssl_session_reused 日志变量与抓包验证复用效果。

开启 proxy_ssl_session_reuse on 能把 Nginx 与 HTTPS 后端之间的 TLS 握手从 2–3 RTT 压缩到 1 RTT,实测建连延迟可从 80–120ms 降至 20–40ms,对微服务间高频、短生命周期调用尤为关键。
必须放在 upstream 块中启用
该指令仅在 upstream 上下文生效,写在 server 或 location 里会被忽略:
- 正确配置示例:
upstream svc-cluster {<br> server auth-service:443;<br> server order-service:443;<br> keepalive 64;<br> proxy_ssl_session_reuse on;<br>} - 若后端是 Kubernetes Service,建议使用 Headless Service + DNS SRV 记录,或确保域名始终解析到稳定 Pod IP,避免因 IP 变动导致会话复用中断
必须协同 keepalive 和 HTTP/1.1 长连接
TLS 会话复用依赖底层 TCP 连接复用,没有长连接,复用无从谈起:
- 在
upstream中设置keepalive 32;(常见取值 16–64,建议按单 worker 并发峰值的 1.5–2 倍估算) - 在
location或upstream对应的 proxy 指令块中添加:proxy_http_version 1.1;<br>proxy_set_header Connection "";
- 确保后端返回
Connection: keep-alive;若返回close,Nginx 会主动断开连接,复用立即失效
关键细节不满足就会退化为完整握手
即使配置全对,以下任一条件不满足,仍会触发完整 TLS 握手,复用率归零:
-
SNI 必须一致:多服务共用同一 IP 的场景(如 Istio Ingress Gateway),需加
proxy_ssl_server_name on;,否则 Nginx 不发送 SNI,后端无法匹配证书 -
TLS 协议版本必须有交集:例如后端只支持 TLSv1.3,而 Nginx 配了
TLSv1.2 TLSv1.3,握手可能失败;建议统一设为proxy_ssl_protocols TLSv1.3;(若后端支持) -
后端必须支持并启用会话恢复:Spring Boot 需配
server.ssl.session.cache.size=1000,Tomcat 需开启sslEnabledProtocols并确保sessionCacheSize > 0;可用openssl s_client -connect svc.example.com:443 -reconnect观察是否出现Reused, SSL handshake succeeded -
证书验证别卡住握手:若启用
proxy_ssl_verify on,而后端证书链不全或使用自签名证书,TLS 握手直接失败;调试阶段建议临时关闭验证确认问题根源
怎么确认它真正在起作用
不能只看配置有没有写,要靠日志和连接行为交叉验证:
- 在
log_format中加入$upstream_ssl_session_reused变量(值为r表示复用,.表示未复用),统计一小时内比例;健康集群应 ≥85% - 执行
ss -tnp | grep :443查看 Nginx 到后端的 ESTAB 连接数;若长期稳定在keepalive × worker_processes附近(如 64×4=256),说明复用良好;若频繁升降,说明连接被主动关闭 - Wireshark 抓包过滤后端 IP:443,对比启用前后握手包数量:复用成功时,多数请求仅含
Change Cipher Spec + Finished(2 包);完整握手则有ClientHello→ServerHello→Certificate→…(4–5 包)











