启用 proxy_ssl_session_reuse on 可使回源连接跳过完整 TLS 握手、仅执行轻量会话恢复,但需在 upstream 块中配置,且依赖 keepalive 长连接、SNI 一致、TLS 版本兼容、后端支持会话缓存及证书稳定等条件协同生效。

启用 proxy_ssl_session_reuse on 本身不能“免除”握手,但能让绝大多数回源连接跳过完整 TLS 握手,仅执行简短的会话恢复流程——这相当于在高频调用场景下,把 2–3 RTT、高 CPU 开销的建连过程,压缩为约 1 RTT 且无需密钥计算与证书验证的轻量操作。
必须在 upstream 块中显式开启
该指令只在 upstream 上下文生效,写在 http、server 或 location 里会被静默忽略:
- ✅ 正确示例:
upstream api_backend {
server svc-a:443;
server svc-b:443;
keepalive 64;
proxy_ssl_session_reuse on;
} - ❌ 错误示例:
location /api {
proxy_pass https://api_backend;
proxy_ssl_session_reuse on;
}
复用依赖底层 TCP 长连接池
TLS 会话复用无法脱离稳定的连接基础。没有长连接,就无会话可复用:
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
- 在
upstream中配置keepalive 32;(建议值:单 worker 并发峰值的 1.5–2 倍) - 在
location或全局 proxy 指令块中添加:proxy_http_version 1.1;proxy_set_header Connection ""; - 确保后端响应头含
Connection: keep-alive;若返回close,Nginx 会立即断开连接,复用中断
关键协同项缺一不可
任一条件不满足,Nginx 就会退化为完整握手,复用率归零:
-
SNI 必须一致:多服务共用网关 IP 时,加
proxy_ssl_server_name on;,否则后端无法匹配证书 -
TLS 版本必须交集非空:例如后端只支持 TLSv1.3,Nginx 配置中就不应包含 TLSv1.2;推荐统一设为
proxy_ssl_protocols TLSv1.2 TLSv1.3;并确认后端实际能力 -
后端必须支持并启用会话恢复:Spring Boot 需设
server.ssl.session.cache.size=1000,Nginx 后端需配ssl_session_cache shared:SSL:10m和足够长的ssl_session_timeout(≥ 4h) -
证书需稳定:轮换证书会导致会话票据失效;自签名或短期签发证书场景下,可考虑临时关闭复用(
proxy_ssl_session_reuse off)换取稳定性
验证是否真实生效
不能只看配置是否存在,要从日志和连接行为交叉判断:
- 在
log_format中加入$upstream_ssl_session_reused变量,统计r(复用)与.(未复用)比例;健康集群应 ≥ 85% - 执行
ss -tnp | grep :443,观察 Nginx 到后端的 ESTAB 连接数是否长期稳定在keepalive × worker_processes附近 - Wireshark 抓包过滤后端 IP:443,复用成功时多数请求仅触发
Change Cipher Spec + Finished(2 包),而非完整握手链路(4–5 包)

















