启用 proxy_ssl_session_reuse on 可使轮询回源请求跳过完整 TLS 握手,仅需 1 RTT 简短握手,显著降低延迟与 CPU 损耗;但必须在 upstream 块中显式配置,并协同 keepalive 连接池、HTTP/1.1 长连接、SNI 一致、TLS 版本兼容及后端会话恢复支持,复用率方可稳定 ≥85%。

启用 proxy_ssl_session_reuse on 本身不能“免除”握手,但能让绝大多数轮询回源请求跳过完整 TLS 握手,只走 1 RTT 的简短握手,从而几乎消除重复建连的延迟与 CPU 损耗。关键在于:它不是单点开关,而是一套协同机制的终点——只有当连接复用、协议对齐、后端支持三者都到位,复用才能稳定发生。
必须在 upstream 块中显式开启
该指令仅在 upstream 上下文生效,写在 location 或 server 里会被忽略:
- ✅ 正确示例:
upstream api_backend {<br> server svc-a:443;<br> server svc-b:443;<br> keepalive 64;<br> proxy_ssl_session_reuse on;<br> } - ❌ 错误写法:
location /api {<br> proxy_pass https://api_backend;<br> proxy_ssl_session_reuse on; <!-- 不生效 --><br> }
依赖长连接池和 HTTP/1.1 协议升级
TLS 会话复用建立在 TCP 连接复用之上。没有空闲连接可复用,就谈不上复用会话:
- 在
upstream中设置keepalive 32;(建议值:单 worker 并发峰值的 1.5–2 倍) - 在
location中添加:proxy_http_version 1.1;<br> proxy_set_header Connection "";
- 确保后端响应头含
Connection: keep-alive;若返回close,Nginx 会立即断开连接,复用中断
绕不开的三个一致性前提
任一不满足,轮询时就会退化为完整握手(2–3 RTT),损耗照旧:
-
SNI 必须一致:多服务共用一个 IP(如 Istio 网关、CDN)时,需加
proxy_ssl_server_name on;,否则 Nginx 不发送 SNI,后端无法匹配证书 -
TLS 版本必须有交集:例如后端只支持 TLSv1.3,Nginx 配置中就不能含
TLSv1.2;推荐统一设为proxy_ssl_protocols TLSv1.3;(若后端支持) -
后端必须支持会话恢复:Spring Boot 要配
server.ssl.session.cache.size=1000,Tomcat 需开启sslEnabledProtocols且sessionCacheSize > 0;可用openssl s_client -connect svc:443 -reconnect观察是否输出Reused, SSL handshake succeeded
验证是否真正在轮询中复用
不能只看配置,要从日志和连接行为确认:
- 在
log_format中加入$upstream_ssl_session_reused变量:log_format main '... "$upstream_ssl_session_reused"';
值为r表示复用成功,.表示未复用;轮询场景下健康复用率应 ≥85% - 执行
ss -tnp | grep :443,观察到后端的 ESTAB 连接数长期稳定(如keepalive 64 × 4 workers = 256左右),说明连接与会话都在持续复用 - Wireshark 抓包过滤目标后端端口,复用成功时多数请求仅触发
Change Cipher Spec + Finished(2 包),而非完整握手流程(4–5 包)











