开启 proxy_ssl_session_reuse on 可将 tls 握手压缩至 1 rtt,延迟降至 20–40ms,p95 延迟下降约 30%,但必须在 upstream 块中配置,配合 keepalive、http/1.1 长连接、sni 一致、tls 版本/票据对齐及后端会话缓存等协同生效。

开启 proxy_ssl_session_reuse on 能把 Nginx 与 HTTPS 后端之间的 TLS 握手从 2–3 RTT 压缩到 1 RTT,单次建连延迟可从 80–120ms 降至 20–40ms,在微服务高频调用场景下,P95 端到端延迟通常下降约 30%。但它不是独立生效的开关,必须和连接复用、协议对齐、SNI 传递等协同配置一起落地。
必须在 upstream 块中显式启用
该指令只在 upstream 上下文中有效,写在 server 或 location 里会被忽略:
- ✅ 正确写法:
upstream svc_cluster {
server svc-a.default.svc.cluster.local:443;
server svc-b.default.svc.cluster.local:443;
keepalive 64;
proxy_ssl_session_reuse on;
} - ❌ 错误写法:
location /api {
proxy_pass https://svc_cluster;
proxy_ssl_session_reuse on;
}
若后端是 Kubernetes Service,建议使用 Headless Service + DNS SRV 记录,或确保域名稳定解析到 Pod IP,避免因 IP 变更导致会话票据失效。
必须配套 keepalive 和 HTTP/1.1 长连接
TLS 会话复用依赖底层 TCP 连接复用。没有长连接池,复用就无从谈起:
-
keepalive 64;:值建议设为单 worker 并发的 1.5–2 倍(例如压测峰值 20k QPS / 4 worker → 每 worker 约 5k 并发 → keepalive 设 64–128) -
proxy_http_version 1.1;和proxy_set_header Connection "";:清空 Connection 头,防止后端返回Connection: close主动断连 - 后端需响应
Connection: keep-alive,否则 Nginx 会立即关闭连接
关键细节决定复用是否真正发生
即使配置全对,以下任一条件不满足,Nginx 仍会退化为完整握手:
-
SNI 必须一致:多服务共用网关 IP 时,必须加
proxy_ssl_server_name on;,否则后端无法匹配证书,拒绝复用 -
TLS 版本必须有交集:若后端只支持 TLS 1.3,Nginx 配置中就不能含
TLSv1.2;推荐统一设为proxy_ssl_protocols TLSv1.2 TLSv1.3;并确认后端实际支持 -
后端要支持并启用会话票据(Session Ticket)或 Session ID 缓存:例如 Spring Boot 需配置
server.ssl.session.cache.size,Nginx 后端需配ssl_session_cache shared:SSL:10m和足够长的ssl_session_timeout(建议 ≥ 4h) - 证书不能频繁轮换:证书变更会导致会话票据解密失败,复用率骤降;自签名或短期签发证书场景需格外谨慎
怎么确认它真正在起作用
不能只看配置有没有写,要从行为和日志交叉验证:
- 在
log_format中加入$upstream_ssl_session_reused变量(值为r表示复用,.表示未复用),统计 1 小时内复用率;健康集群应稳定在 85% 以上 - 执行
ss -tnp | grep :443观察 Nginx 到后端的 ESTAB 连接数:若长期稳定在keepalive × worker_processes附近(如 64 × 4 = 256),说明复用良好;若频繁升降,说明连接被主动关闭 - Wireshark 抓包过滤后端 IP:443,对比启用前后 TLS 握手包数量:复用成功时,多数请求仅触发
Change Cipher Spec + Finished(2 包),而非完整握手(4–5 包)











