nginx https会话缓存是tls层的会话复用机制,通过shared内存池实现跨worker复用,并可选session tickets无状态方案,与http内容缓存完全隔离。

Nginx 对 HTTPS 会话缓存的处理,本质是 TLS 层的会话状态复用机制,不涉及应用层内容缓存,也不依赖反向代理的 proxy_cache。它发生在 SSL/TLS 握手阶段,目标是减少密钥交换开销,提升连接建立效率——这是纯网络协议层的优化,与后续 HTTP 响应是否缓存完全独立。
共享内存池实现跨进程会话复用
Nginx 默认每个 worker 进程独立处理连接,但 TLS 会话 ID 若只存在单个 worker 内存中,其他 worker 就无法复用,导致复用率低下。解决方案是使用 shared 类型会话缓存:
-
ssl_session_cache shared:SSL:10m在http块顶层声明,分配 10MB 共享内存,所有 worker 进程共用同一张会话表 - 1MB 约支持 3000–4000 个会话条目(取决于证书链长度和 TLS 版本),高并发场景建议设为 50m~100m
- 该内存由 master 进程统一管理,worker 通过原子操作读写,避免锁竞争
Session Tickets 作为无状态补充机制
当客户端不支持或服务端未启用共享缓存时,ssl_session_tickets on 提供另一条路径:服务器生成加密票据(encrypted session ticket),随 ServerHello 发送给客户端;客户端下次连接时携带该票据,Nginx 解密后直接恢复会话上下文。
- 无需服务端存储状态,天然支持多机部署和 worker 扩缩容
- 必须配合
ssl_session_ticket_key使用,密钥为二进制文件(至少 32 字节),建议定期轮换 - 对老旧客户端(如 Android 4.x)兼容性更好,可与 shared 缓存并存,形成双保险
超时控制与内存回收策略
会话不是永久有效,Nginx 通过两级时间控制平衡复用率与内存占用:
-
ssl_session_timeout 4h设定服务端缓存条目的最大存活时间,超时后自动从共享内存中清理 - 实际复用还受客户端行为影响:浏览器可能主动丢弃票据,或 TLS 实现限制票据有效期(如 Chrome 通常限制为 24 小时)
- 共享内存满时,采用 LRU(最近最少使用)策略淘汰旧条目,不阻塞新连接建立
与 HTTPS 内容缓存的隔离设计
需要明确区分两个“缓存”:TLS 会话缓存(session cache)作用于 TCP+TLS 层,只保存加密协商参数;而反向代理缓存(proxy_cache)作用于 HTTP 层,缓存解密后的明文响应。二者完全解耦:
- 启用
ssl_session_cache不会影响proxy_cache_key构成,也不改变响应缓存逻辑 - 即使关闭所有 HTTP 缓存,TLS 会话复用仍可生效,降低握手延迟
- 在边缘集群中,只有最外层 Nginx 做 TLS 终止并维护会话缓存,内网转发走明文 HTTP,避免多层会话截断











