proxy_ssl_session_reuse on 必须在upstream块中配置才生效,可跳过TLS非对称运算,降低CPU开销30%–50%,但需配套keepalive、HTTP/1.1保活、SNI对齐及后端会话票据支持四项缺一不可。

proxy_ssl_session_reuse on 本身不能“免除”TLS非对称加解密,但它能跳过绝大多数高频轮询中本该重复执行的非对称运算——前提是复用真实发生。关键不在于指令本身,而在于它所依赖的复用链路是否稳固。
必须放在 upstream 块中才起作用
该指令只在 upstream 上下文生效,写在 location、server 或 http 块里语法无误,但完全被忽略。
- ✅ 正确:
upstream poll_backend { server api.health.example.com:443; keepalive 32; proxy_ssl_session_reuse on; } - ❌ 无效(高频轮询场景下等于没配):
location /health { proxy_pass https://poll_backend; proxy_ssl_session_reuse on; # ← 此处不生效 }
复用成功 = 跳过非对称握手步骤
完整 TLS 握手需执行:RSA/ECDHE 密钥交换、证书验签、ServerKeyExchange 签名验证等非对称操作。而会话复用(Session Resumption)仅需:
- 客户端发送
session_id或pre_shared_key扩展 - 服务端查缓存/解密 ticket 后直接生成主密钥
- 双方交换
ChangeCipherSpec+Finished
整个过程不触发新的非对称计算,CPU 密钥协商开销下降 30%–50%,对每秒数百次的健康检查或配置轮询(如 etcd watch、consul health endpoint)效果极显著。
四项配套缺一不可,否则复用失败,非对称计算照常发生
-
长连接池支撑:
keepalive 32;提供可复用的空闲连接载体;若连接被后端主动关闭(如 Spring Boot 默认 20s 断连),复用即中断 -
HTTP/1.1 长连接保活:
proxy_http_version 1.1; proxy_set_header Connection "";
防止后端收到
Connection: close后立即断连 -
SNI 与 TLS 协议严格对齐:
proxy_ssl_server_name on; # 多域名共 IP 必开 proxy_ssl_protocols TLSv1.2 TLSv1.3; proxy_ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:...;
版本或套件不一致 → 强制完整握手 → 非对称计算回归
-
后端必须支持并稳定返回会话票据:
- 若后端是 Nginx:需
ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h; - 若启用
ssl_session_tickets on:所有实例必须共享同一ssl_session_ticket_key,否则票据无法解密,复用失效
- 若后端是 Nginx:需
验证是否真跳过了非对称运算
别只看配置,用实证判断:
- 在
log_format中加入$upstream_ssl_session_reused,统计r(复用)占比,目标 ≥90% - 抓包观察 TLS 流程:复用成功时只有
Change Cipher Spec+Finished,没有Certificate和Server Key Exchange - 监控 Nginx worker 进程 CPU:开启前后对比
openssl speed ecdsap256类负载,下降明显即说明非对称压力释放
不复杂但容易忽略


















