开启proxy_ssl_session_reuse on是降低nginx代理https后端tls开销最直接有效的方式,需在upstream块中显式配置,并协同keepalive连接池、http/1.1长连接、sni对齐及后端会话恢复支持,方可将建连延迟从2–3 rtt压至1 rtt,cpu消耗降30%+,复用率稳达90%+。

要显著降低 Nginx 代理到 HTTPS 后端的 TLS 开销,关键不是“开了 proxy_ssl_session_reuse 就行”,而是让会话复用真正稳定生效。它能将每次建连的 TLS 握手从 2–3 RTT 压缩到 1 RTT,实测延迟下降 30%–40%,CPU 和熵池压力同步减少。但配置错位置、缺配套项、或后端不配合,都会让它形同虚设。
必须放在 upstream 块中启用
proxy_ssl_session_reuse 只在 upstream 上下文有效,写在 http、server 或 location 里会被忽略:
- ✅ 正确示例:
upstream api_backend {<br> server svc-a.example.com:443;<br> server svc-b.example.com:443;<br> keepalive 64;<br> proxy_ssl_session_reuse on;<br> proxy_ssl_server_name on; <!-- 若用域名,必须开 --><br>} - ❌ 常见错误:在 location 中写
proxy_ssl_session_reuse on;—— 语法无报错,但完全不生效 - ⚠️ 注意:该指令仅对
https://协议的proxy_pass起作用;若 upstream 指向http://或协议拼写错误(如https//),指令自动失效
必须协同三项基础配置
SSL 会话复用依赖底层 TCP 连接复用和协议一致性。缺少任一,复用率归零:
-
keepalive 连接池:在 upstream 中设置
keepalive 32;(建议 16–128,按后端吞吐与 worker 数调整);值太小会导致连接快速耗尽,被迫新建 -
HTTP/1.1 长连接显式声明:在 location 或 proxy 指令块中添加
proxy_http_version 1.1;proxy_set_header Connection '';
防止后端返回Connection: close导致 Nginx 主动断连 -
TLS 协议与 SNI 对齐:统一配置
proxy_ssl_protocols TLSv1.2 TLSv1.3;,禁用 TLSv1.0/1.1;若后端是多域名共 IP(如云网关),必须加proxy_ssl_server_name on;,否则 SNI 缺失,证书匹配失败,复用中断
后端必须支持并正确暴露会话恢复能力
Nginx 只是“复用者”,前提是后端愿意提供可复用的会话。常见瓶颈不在 Nginx,而在后端:
- 检查后端是否启用 TLS 会话缓存:对后端执行
openssl s_client -connect backend.example.com:443 -reconnect -servername example.com
观察输出是否有Reused, SSL handshake succeeded;若无,优先调后端配置 - Java 应用(如 Tomcat)需设置:
sslEnabledProtocols="TLSv1.2,TLSv1.3"+sessionCacheSize="500" - Spring Boot 需开启 session cache:
server.ssl.session.cache.size=500,且多实例必须共享同一ssl_session_ticket_key - 避免后端短超时:如
ssl_session_timeout 30s,而 Nginx keepalive_timeout 设为 60s,连接早被后端关闭,复用无从谈起
验证是否真实生效,而非仅看配置
不能只确认配置写了没,要从行为和日志交叉判断:
- 在
log_format中加入变量:'$upstream_ssl_session_reused'(值为r表示复用,.表示新建);健康集群应稳定在 85% 以上 - 用
ss -tnp | grep :443观察 ESTAB 连接数:若长期稳定在keepalive × worker_processes附近(如 64×4=256),说明复用良好;若频繁升降,说明连接被主动关闭 - Wireshark 抓包过滤后端端口:复用成功时,多数请求仅触发
Change Cipher Spec + Finished(2 包);完整握手则有ClientHello → Certificate → ...(4–5 包)











