开启 proxy_ssl_session_reuse on 可减少 Nginx 与 HTTPS 后端间的完整 TLS 握手频次,需在 upstream 块中配置,配合 keepalive、HTTP/1.1 和 TLS 协议一致性使用,并通过 $upstream_ssl_session_reused 日志及连接数验证复用效果。

开启 proxy_ssl_session_reuse on 能直接减少 Nginx 与 HTTPS 后端之间的 TLS 完整握手频次,对大规模微服务集群尤其关键——每跳 HTTPS 转发若都走完整握手,延迟叠加、CPU 消耗陡增,会迅速成为全链路瓶颈。
必须在 upstream 块中启用
该指令仅在 upstream 上下文中生效,不能写在 server 或 location 里:
- 正确示例:
upstream api_cluster {<br> server svc-a.example.com:443;<br> server svc-b.example.com:443;<br> keepalive 64;<br> proxy_ssl_session_reuse on;<br>} - 若后端是 Kubernetes Service,域名需解析到 Pod IP 或使用 Headless Service + DNS SRV 记录,确保连接复用不因 IP 变动中断
- 多实例后端必须支持并启用 TLS session ticket(如 Spring Boot 的
server.ssl.session.cache.size)且共享密钥,否则复用率归零
配合 keepalive 与协议一致性使用
单独开 proxy_ssl_session_reuse 效果有限,必须协同以下三项:
-
keepalive 32;:维持上游连接池,值建议设为单 worker 连接并发的 1.5–2 倍(例如压测峰值 20k QPS / 4 worker → 每 worker 约 5k 并发 → keepalive 设 64–128) -
proxy_http_version 1.1;和proxy_set_header Connection '';:显式关闭 Connection close,避免后端误关连接 -
proxy_ssl_protocols TLSv1.2 TLSv1.3;:前后端 TLS 版本必须交集非空;若后端只支持 TLS 1.3,Nginx 配置中不可含TLSv1.2,否则握手失败导致复用失效
验证复用是否真实生效
不能只看配置是否存在,要从行为和日志双重确认:
- 在
log_format中加入$upstream_ssl_session_reused变量,统计 1 小时内r(复用)与.(未复用)比例;健康集群应稳定在 85% 以上 - 用
ss -tnp | grep :443观察 Nginx 到后端的 ESTAB 连接数,若长期稳定在keepalive × worker_processes附近(如 keepalive 64 × 4 worker = 256),说明复用良好;若频繁升降,则存在连接被主动关闭 - Wireshark 抓包过滤后端 IP:443,对比启用前后 TLS 握手包数量:复用成功时,多数请求仅触发
Change Cipher Spec + Finished(2 包),而非完整的 ClientHello→ServerHello→Certificate→…(4–5 包)
绕过证书校验时的注意事项
测试环境若用自签名证书,需额外配置但不可照搬进生产:
-
proxy_ssl_verify off;必须配合proxy_ssl_trusted_certificate指向可信 CA 文件,否则 Nginx 会拒绝建立连接(即使 verify 关闭) - 禁用验证后,TLS 复用仍可工作,但安全边界已丢失;生产环境务必启用
proxy_ssl_verify on并部署完整信任链 - 若后端证书由私有 CA 签发,需将该 CA 证书合并入
proxy_ssl_trusted_certificate所指文件,并确保所有 Nginx 实例使用同一份证书文件


















