必须在upstream块中配置proxy_ssl_session_reuse on,并配套keepalive连接池、HTTP/1.1升级、SNI传递及TLS版本一致,才能稳定复用TLS会话,避免完整握手;错放位置或任一协同项缺失均导致复用失效。

要真正免除高频回源时的完整 TLS 握手,关键不是“打开一个开关”,而是让 Nginx 与后端 HTTPS 服务之间稳定复用已建立的 TLS 会话。这需要 upstream 配置、连接管理、协议对齐和后端协同四者同时到位。
必须在 upstream 块中启用
proxy_ssl_session_reuse 只在 upstream 上下文生效,写在 location、server 或 http 块里会被忽略——配置不报错,但实际无效。
- 正确写法:
upstream api_backend {
server backend1.example.com:443;
server backend2.example.com:443;
keepalive 32;
proxy_ssl_session_reuse on;
}
- 若 upstream 中使用域名(如 server api.prod.cloud:443),必须额外添加 proxy_ssl_server_name on;,确保 SNI 正确传递,否则证书匹配失败,复用立即中断。
配套长连接池与 HTTP/1.1 升级
TLS 会话复用依赖底层 TCP 连接复用。没有 keepalive 连接池,复用无从谈起。
- 在 upstream 中设置 keepalive 16–64(常见值为 32;建议按单 worker 并发峰值的 1.5–2 倍估算)
- 在对应 location 或 proxy 指令块中添加:
proxy_http_version 1.1;
proxy_set_header Connection ''; - 确认后端响应头含 Connection: keep-alive;若返回 Connection: close,Nginx 会主动断连,复用失效
确保 TLS 协议与后端严格一致
只要协议版本、密钥套件或 SNI 任一环节不匹配,就会退化为完整握手(2–3 RTT),复用率归零。
- 统一配置 TLS 版本:
proxy_ssl_protocols TLSv1.2 TLSv1.3;(禁用 TLSv1.0/v1.1) - 检查 Nginx OpenSSL 版本:
nginx -V 2>&1 | grep -o 'OpenSSL [^ ]*',确认支持 TLS 1.2/1.3 - 若后端启用 Session Ticket(如 Envoy、Nginx 自身作后端),所有实例必须共享同一 ssl_session_ticket_key,否则票据无法解密
验证是否真实复用,而非仅看配置
不能只确认指令写了,要通过日志和行为交叉验证:
- 在 log_format 中加入变量:
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$upstream_ssl_session_reused"'; - 日志中该字段值为 r 表示复用成功;. 表示未复用(新建会话)
- 抓包验证更可靠:复用成功时只有 Change Cipher Spec + Finished;完整握手则包含 ClientHello → ServerHello → Certificate 等全过程











