proxy_ssl_session_reuse on 必须置于upstream块内且搭配proxy_http_version 1.1、keepalive及proxy_ssl_server_name等配置,才能实现SSL会话复用,降低TLS握手延迟。

proxy_ssl_session_reuse on 是优化 Nginx 反向代理到 HTTPS 后端时 SSL 握手性能的核心配置,但它不是“一开就灵”的开关——必须放在正确位置、搭配关键支撑项,才能真正跳过完整 TLS 握手(2–3 RTT),将建连延迟压到 20–40ms,复用率稳定在 90% 以上。
必须写在 upstream 块里才生效
这个指令只在 upstream 上下文中起作用,且仅对 https:// 协议的后端地址生效。
写在 location、server 或 http 块里,语法不报错,但完全被忽略。
✅ 正确写法:
upstream api_backend {
server api.example.com:443;
server api2.example.com:443;
keepalive 32;
proxy_ssl_session_reuse on;
}⚠️ 常见错误:
- 后端地址写成
http://backend:443或https://backend:80→ 协议/端口不匹配,Nginx 不走 SSL 层 -
proxy_pass指向的 upstream 名称拼错或未定义 → 配置形同虚设
三项配套配置缺一不可
单靠 proxy_ssl_session_reuse on 无法保证复用成功,必须同步落实:
-
启用 HTTP/1.1 长连接
在location或server块中添加:proxy_http_version 1.1; proxy_set_header Connection '';
目的是避免后端返回
Connection: close导致连接被强制断开。 配置 keepalive 连接池
upstream中的keepalive 32;表示每个 worker 进程最多缓存 32 条空闲连接供复用。
建议值:按单 worker 并发峰值的 1.5–2 倍估算(例如并发 5k,可设 64–128)。-
透传 SNI(尤其对接多域名后端)
若后端是泛域名、云网关或 mTLS 服务,必须加:proxy_ssl_server_name on; proxy_ssl_name $host; # 动态取客户端 Host 头,推荐
否则 Nginx 默认不发 SNI,后端无法匹配证书,复用立即中断。
TLS 协议与后端严格对齐
只要协议版本、密钥套件或 SNI 任一环节不匹配,就会退化为完整握手,复用率归零。
-
统一 TLS 版本(禁用老旧协议):
proxy_ssl_protocols TLSv1.2 TLSv1.3;
-
指定高性能加密套件(放在
location或server块中):proxy_ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:CHACHA20-POLY1305-SHA256"; proxy_ssl_ecdh_curve secp384r1:prime256v1;
确保后端也支持会话恢复:自身需启用
ssl_session_cache和ssl_session_timeout,且不频繁轮换 session ticket 密钥。
验证是否真实复用,而非仅看配置
不能只确认指令写了,要通过日志和行为交叉验证:
-
在
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表示复用成功;.表示新建会话。 观察
ss -tnp | grep :443,确认 ESTABLISHED 连接数是否稳定在keepalive设定值附近,而非持续新建/断开。用
openssl s_client -connect backend-host:443 -reconnect直连测试后端,确认输出含Reused, SSL handshake succeeded。
不复杂但容易忽略



















