proxy_ssl_session_reuse需在upstream块中配置on,配合keepalive、TLS版本一致及HTTP/1.1升级,才能有效复用HTTPS连接、降低握手开销;配置在location等层级无效。

直接在 upstream 块中启用 proxy_ssl_session_reuse on,并确保与后端 TLS 版本、会话票据、连接保活策略协同工作,是提升大规模并发回源 HTTPS 性能最有效且成本最低的手段之一。
必须放在 upstream 块中配置
该指令只对反向代理到 HTTPS 后端生效,且仅在 upstream 上下文有效,不能写在 http/server/location 级别(否则会被忽略):
- 正确写法:
upstream api_backend {<br> server 10.0.1.10:443;<br> keepalive 32;<br> proxy_ssl_session_reuse on;<br>} - 错误写法:
location /api {<br> proxy_pass https://api_backend;<br> proxy_ssl_session_reuse on; # ← 此处无效! - 若用域名做 upstream(如
server api.example.com:443),还需配proxy_ssl_server_name on,确保 SNI 正确传递,避免证书不匹配导致复用失败
必须配合 keepalive 和协议升级
SSL 会话复用依赖底层 TCP 连接复用。没有长连接,TLS 复用就无从谈起:
- 在 upstream 中设置
keepalive N(建议 16–64,视后端吞吐能力调整) - 在 location 或 upstream 对应的 proxy 指令块中添加:
proxy_http_version 1.1;proxy_set_header Connection ''; - 确保后端支持 HTTP/1.1 及 Connection: keep-alive 响应头;若后端返回
Connection: close,Nginx 会主动断连,复用立即失效
注意 TLS 协议与后端兼容性
哪怕只差一个版本,TLS 握手也会降级为完整流程,复用率归零:
- 检查 Nginx 编译所用 OpenSSL 版本(
nginx -V 2>&1 | grep -o 'OpenSSL [^ ]*'),确认支持 TLS 1.2/1.3 - 统一配置:
proxy_ssl_protocols TLSv1.2 TLSv1.3;
禁用 TLSv1.0/TLSv1.1(已不安全,且多数现代后端默认不支持) - 多实例后端若启用 session ticket,需确保所有节点共享同一
ssl_session_ticket_key;否则 ticket 解密失败,复用中断 - 避免混用 TLS 版本:例如 Nginx 配了
TLSv1.2,而后端只开放TLSv1.3,必然握手失败
验证复用是否真实生效
不能只看配置是否加上,要从连接行为和日志两个维度交叉确认:
- 在 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观察到稳定维持在keepalive × worker_processes量级的 ESTABLISHED 连接,而非持续新建/关闭 - Wireshark 抓包过滤后端 IP:PORT,对比启用前后 TLS 握手轮次:复用成功时应只有
Change Cipher Spec + Finished,无Server Hello之前的完整交互











