proxy_ssl_session_reuse用于Nginx反向代理HTTPS后端时复用TLS会话,减少握手开销、降低延迟和CPU消耗;需在upstream块中配置on,并配合keepalive与TLS版本一致性使用。

开启 proxy_ssl_session_reuse 能显著提升 Nginx 与后端 HTTPS 服务之间的连接复用率,减少 TLS 握手开销,降低延迟和 CPU 消耗。它专用于 upstream 场景——即 Nginx 作为反向代理,后端是 HTTPS 接口(如 API 网关、微服务、SaaS 接口等)时的关键优化项。
为什么需要 proxy_ssl_session_reuse
默认情况下,Nginx 每次转发请求到 HTTPS 后端,都会新建 TCP + TLS 连接。即使 upstream 已配 keepalive,若未启用 SSL 层复用,仍会触发完整 TLS 握手(含证书交换、密钥协商),消耗约 100ms(按 50ms RTT 估算)。启用该指令后,Nginx 可复用已建立的 TLS 会话,跳过大部分握手步骤,实测性能提升达 30%~40%。
正确配置方式
该指令必须在 upstream 块中设置,且仅对 HTTPS 后端生效:
- 在 upstream 中添加:
proxy_ssl_session_reuse on; - 确保后端支持 TLS 会话复用(主流 HTTP 客户端库、Spring Boot WebFlux、Envoy、Nginx 自身均默认支持)
- 配合长连接使用:
keepalive 32;+proxy_http_version 1.1;+proxy_set_header Connection ''; - 若后端使用自签名或私有 CA 证书,需额外配置
proxy_ssl_trusted_certificate和proxy_ssl_verify off;(生产环境慎用)
验证是否生效
不能只看 Nginx 日志,要从连接行为和 TLS 层双重确认:
- 抓包观察:用
wireshark过滤后端端口,对比启用前后 TLS 握手包数量——复用成功时应出现Change Cipher Spec+Finished的简短流程,而非完整 4–5 轮交互 - 统计复用率:在
log_format中加入$upstream_ssl_session_reused变量(值为.表示未复用,r表示复用),聚合分析比例 - 监控连接状态:执行
ss -tnp | grep :<backend_port></backend_port>,复用率高时活跃连接数应稳定在keepalive × worker_processes附近,而非持续涨落
常见失效原因
即使配置了 proxy_ssl_session_reuse on,以下情况仍会导致复用失败:
- 后端主动关闭连接(如返回
Connection: close或空闲超时早于 Nginx 的keepalive_timeout) - Nginx 与后端 TLS 版本不一致(例如后端仅支持 TLS 1.3,而 Nginx client 配置了
proxy_ssl_protocols TLSv1.2;) - 后端启用了 session ticket 但密钥不统一(多实例场景下需确保所有后端共享同一票据密钥)
- 启用了
proxy_buffering off且响应流式传输,Nginx 可能提前释放连接


















