开启 proxy_ssl_session_reuse 可减少 nginx 与上游 https 服务的 tls 握手开销,但需上游支持会话复用、正确配置 tls 参数及 openssl 版本兼容,并通过日志或抓包验证生效。

开启 proxy_ssl_session_reuse 能显著减少 Nginx 与上游 HTTPS 服务(如后端 API、另一台 Nginx 或云服务)之间 TLS 握手的开销,尤其在高并发或短连接频繁的场景下,避免重复协商带来的延迟和 CPU 消耗。它本身不“保证”完美复用,而是为复用创造必要条件——实际是否成功,还取决于上游服务器是否支持并正确配置了会话票据(Session Tickets)或会话 ID(Session IDs),以及双方 TLS 版本、密码套件等是否兼容。
确认 upstream 服务支持 SSL 会话复用
这是前提。若后端不支持或禁用了会话复用,Nginx 单方面开启该指令无效。
- 对于 OpenSSL 后端(如 Nginx、Apache、Tomcat),需确保其启用了
ssl_session_cache(如shared:SSL:10m)且未设置ssl_session_timeout过短; - 对于现代服务(如 Envoy、Traefik、Cloudflare),默认通常启用 Session Tickets,无需额外配置;
- 可通过
openssl s_client -connect upstream.example.com:443 -reconnect观察输出中是否出现Reused session-id来验证。
在 proxy 配置中正确启用并配合关键参数
仅设 proxy_ssl_session_reuse on 不够,需搭配其他 SSL 代理行为控制项:
- 必须指定
proxy_ssl_protocols(如TLSv1.2 TLSv1.3),避免协商降级导致会话不可复用; - 建议显式设置
proxy_ssl_ciphers,使用支持前向安全且广泛兼容的套件(如ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256); - 若上游使用自签名或私有 CA 证书,需通过
proxy_ssl_trusted_certificate和proxy_ssl_verify on启用校验,否则会话复用可能被跳过(OpenSSL 安全策略限制); - 避免在 location 中频繁切换
proxy_pass目标,因为每个 upstream server block 独立维护 SSL 会话缓存。
检查 Nginx 编译与运行时依赖
该功能依赖 OpenSSL 的会话缓存能力,需确认:
- Nginx 编译时链接的是较新版本 OpenSSL(≥1.0.2 或 ≥1.1.1),旧版对 TLS 1.3 Session Tickets 支持不完整;
- 未禁用
--without-http_ssl_module; - 运行时无
SSL_CTX_set_session_cache_mode相关错误日志(可通过error_log /path/to/log debug;查看 SSL handshake 细节)。
验证复用是否生效
最直接方式是抓包或查日志:
- 用 Wireshark 抓取 Nginx 到 upstream 的流量,观察 ClientHello 是否携带
session_ticket扩展,ServerHello 是否返回ticket且后续请求复用; - 启用 Nginx debug 日志(
error_log ... debug;),搜索SSL reused session或SSL new session关键字; - 对比开启前后 upstream 的 TLS handshake 耗时(如用
curl -w "@format.txt" -o /dev/null -s https://upstream/),复用正常时 handshake 时间应明显下降且稳定。











