要让 Nginx 在反向代理中复用上游 HTTPS 的 TLS 连接,必须同时配置三项:proxy_ssl_session_cache 设为 shared:PROXY_SSL:20m(需在 http 块顶层)、proxy_ssl_session_timeout 与上游实际会话有效期匹配、proxy_ssl_keepalive 配合 upstream keepalive;缺一不可。

要让 Nginx 在反向代理场景下复用与上游 HTTPS 服务的 TLS 连接,关键不是“开启复用”,而是**正确配置 proxy_ssl_session_cache 的共享机制**。它和客户端侧的 ssl_session_cache 是两套独立系统,不能混用或互相替代。
必须用 shared,否则多 worker 下基本无效
proxy_ssl_session_cache 默认是 builtin 模式,每个 worker 进程维护自己的一份缓存,互不共享。当请求被不同 worker 处理时,即使目标 upstream 相同,也无法复用已建立的 TLS 会话。
- 生产环境必须配置为 shared:PROXY_SSL:20m(名称可自定义,大小建议 20MB 起步)
- 该指令必须写在 http 块顶层,不能只放在某个 upstream 或 location 里
- Windows 环境不支持 shared,proxy_ssl_session_cache 只能设为 builtin 或 off,复用率天然受限
超时时间要匹配上游真实行为
proxy_ssl_session_timeout 不是越长越好,它必须和 upstream 实际的会话有效期对齐,否则缓存条目长期滞留却无法命中。
- 标准 Web 后端(如 Flask、Express):设为 5m–10m
- 内网 Java 微服务或 API 网关:若 upstream 显式启用 session 复用且连接稳定,可设为 30m–2h
- 高频健康检查或轮询服务:建议 1m–2m,避免探测连接挤占缓存空间
- 上游不支持复用(如老旧 LB):直接设为 0 或省略该指令,避免内存浪费
三项配置缺一不可
单独调大 timeout 或加 shared 缓存都不起作用,以下三者必须同时生效:
- proxy_ssl_session_cache shared:PROXY_SSL:20m —— 提供跨 worker 共享内存区
- proxy_ssl_session_timeout 10m —— 控制条目生命周期
- proxy_ssl_keepalive 32(配合 upstream keepalive)—— 维持空闲连接,让复用有机会发生
验证是否真正生效
不要只看配置有没有报错,重点观察实际复用行为:
- 用 openssl s_client -connect upstream-host:443 -reconnect 直连测试 upstream,确认它本身支持复用(输出含 Reused, SSL handshake succeeded)
- 开启 Nginx debug 日志(error_log /path/to/log debug;),搜索 SSL reused session 和 SSL new session 行数比值
- 监控代理层 TLS 握手耗时(ssl_handshake_time),明显下降说明复用成功


















