nginx反向代理中启用后端tls会话复用需在upstream块配置keepalive,并显式设置proxy_ssl_session_reuse on;同时推荐限定tls协议与密钥交换算法以提升复用成功率。

在 Nginx 中配置反向代理并启用 SSL 缓存复用(即 TLS session resumption),关键在于正确设置上游(backend)连接的 SSL 会话缓存策略,而不是客户端到 Nginx 的那层。因为 Nginx 作为代理时,它与后端服务器之间是独立的 TLS 连接,需主动开启并复用该连接上的 TLS 会话。
确保 upstream 块启用 keepalive 和 SSL 会话复用
Nginx 默认不会为 upstream 的 HTTPS 后端复用 TLS 会话。需显式配置 keepalive 并配合 SSL 相关指令:
- 使用
upstream块定义后端,并添加keepalive 32;(保持空闲连接数,建议 16–64) - 在
location或proxy_pass所在上下文中,添加:proxy_ssl_session_reuse on;—— 这是启用后端 TLS 会话复用的核心开关(默认为on,但显式声明更稳妥) - 若后端支持 TLS 1.2/1.3,Nginx 1.19.0+ 会自动尝试使用 Session Tickets;无需额外配置即可复用 ticket
优化后端连接的 SSL 参数(可选但推荐)
进一步降低握手开销,可调整以下参数(写在 location 或 server 块中):
-
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 禁用老旧协议,提升复用成功率 -
proxy_ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;—— 优先选用支持前向安全且兼容 session resumption 的密钥交换方式 -
proxy_ssl_verify off;(仅测试环境)或配置有效 CA 链(生产环境必须校验)—— 若证书验证失败,会中断连接,导致无法复用
验证是否生效
可通过 Nginx 日志或后端服务日志间接判断:
- 开启 Nginx 的
error_log ... debug;,搜索"SSL reused session"或"using session"类似日志行(需编译时含--with-debug) - 在后端(如 OpenSSL 服务)启用详细 TLS 日志,观察
New sessionvsReused session出现频次 - 用
openssl s_client -connect backend:443 -reconnect手动测试,看是否出现Reused, TLSv1.3
注意点:session 复用的前提条件
即使配置正确,复用也可能失败,常见原因包括:
- 后端服务器未开启 session ticket 或 session cache(如 Nginx、Apache、Envoy 需各自配置)
- 后端证书变更或私钥轮换,导致旧 ticket 无法解密
- upstream 连接被主动关闭(如后端超时、网络中断),缓存失效
- Nginx worker 进程重启,内存中的 session 缓存丢失(无共享缓存机制)











