开启 proxy_ssl_session_reuse on 能跳过大部分 TLS 非对称运算,大幅降低密钥交换开销;必须置于 upstream 块中才生效,配合 keepalive、HTTP/1.1、SNI 一致及后端会话恢复支持,复用失败则回落完整握手。

开启 proxy_ssl_session_reuse on 并不能“免除”TLS非对称运算,但它能有效**跳过大部分非对称计算环节**,大幅降低高频轮询场景下的密钥交换开销。关键在于:复用已建立的会话后,Nginx 不再每次执行 RSA 密钥传输或 ECDHE 参数协商与签名验证,而是直接使用缓存的主密钥(Master Secret)派生会话密钥,将耗时的非对称操作从每次建连中移除。
必须放在 upstream 块中才起作用
该指令仅在 upstream 上下文生效,写在 server、location 或 http 块里会被静默忽略——语法不报错,但实际不参与任何 TLS 处理。
- ✅ 正确示例:
upstream svc-api {<br> server api-a:443;<br> server api-b:443;<br> keepalive 64;<br> proxy_ssl_session_reuse on;<br>} - ❌ 错误示例:
location /api {<br> proxy_pass https://svc-api;<br> proxy_ssl_session_reuse on; }
复用的前提是连接可复用、参数可匹配
非对称运算能否被跳过,取决于底层 TCP 连接是否复用,以及 TLS 协商参数是否一致。任一条件不满足,Nginx 就会回落到完整握手,重新执行证书验证、密钥交换等非对称步骤。
- 启用长连接池:
keepalive 32;(建议按单 worker 并发峰值的 1.5–2 倍设置),确保空闲 HTTPS 连接持续存在 - 强制 HTTP/1.1 + 清空 Connection 头:
proxy_http_version 1.1;和proxy_set_header Connection "";,防止后端返回Connection: close主动断连 - SNI 必须一致:多服务共用 IP 时(如 Istio 网关),加
proxy_ssl_server_name on;,否则后端无法匹配证书,拒绝复用 - TLS 版本与加密套件需有交集:例如后端只支持 TLSv1.3,Nginx 配置中就不应含 TLSv1.2;推荐统一设为
proxy_ssl_protocols TLSv1.3;(若后端支持)
后端必须支持并稳定提供会话恢复能力
如果后端不保存或不返回有效的会话票据(Session Ticket)或会话 ID(Session ID),Nginx 就没有可复用的上下文,自然无法跳过非对称阶段。
- Spring Boot:配置
server.ssl.session.cache.size=1000,并确保sslEnabledProtocols开启 TLSv1.3 - Tomcat:启用
sslEnabledProtocols,且sessionCacheSize > 0,避免sslSessionTimeout设得太短(如低于 30 秒) - Nginx 自身作后端:需配置
ssl_session_cache shared:SSL:10m;和ssl_session_timeout 4h;,多实例还需共享 session ticket 密钥
如何确认非对称运算真的被跳过了
不能只看配置是否存在,要从行为层面验证是否真正绕开了证书签名、密钥交换等步骤。
- Wireshark 抓包过滤后端端口(如
tls && ip.dst == 10.0.1.100 && tcp.port == 443):复用成功时,多数请求仅触发Change Cipher Spec+Finished(2 个包);完整握手则包含ClientHello → ServerHello → Certificate → CertificateVerify → Finished(4–5 包) - 日志中加入
$upstream_ssl_session_reused变量:r表示复用(跳过非对称),.表示未复用;健康状态应 ≥85% - 观察 CPU 使用率:开启后 Nginx 的用户态 CPU(特别是
openssl相关调用)应下降 30%–50%,尤其在高 QPS 轮询时趋势明显











