Nginx 的 ssl_session_cache 在多 Worker 进程间不自动同步,仅 shared 内存缓存(如 shared:SSL:10m)可实现跨进程共享;本地缓存和外部存储(如文件、Redis)均不被官方支持。

Nginx 的 ssl_session_cache 在多 Worker 进程间**不自动同步**,它本质上是每个 Worker 进程独享的本地内存缓存(shared memory zone 除外)。是否同步、如何共享,完全取决于你配置的缓存类型。
ssl_session_cache 的两种模式决定共享行为
该指令支持两种语法形式,行为截然不同:
-
本地缓存(如
ssl_session_cache off或ssl_session_cache none):完全关闭或禁用缓存,每次 TLS 握手都走完整流程,无共享问题,但性能最差。 -
共享内存缓存(如
ssl_session_cache shared:SSL:10m):这才是多 Worker 下真正可共享的方式。Nginx 会创建一块名为SSL、大小为 10MB 的共享内存区域(shm),所有 Worker 进程通过该区域读写 session 缓存数据,实现跨进程复用。
shared 内存缓存是唯一可靠的多 Worker 共享方案
只要使用 shared:name:size 语法,Nginx 就会自动在 master 进程中分配共享内存,并由所有 worker 进程映射访问。这个机制是 Nginx 内置的、线程安全的,无需额外配置或外部组件。
注意点:
- 共享内存大小需合理预估:默认 1MB 约支持 4000 个 session;10MB 可容纳数万个 session。过小会导致频繁淘汰,降低复用率。
- session 超时由
ssl_session_timeout控制(默认 5 分钟),超时后自动从共享内存中清除,不依赖进程重启。 - 多个 server 块可共用同一 shared zone,只要它们指定相同的 name(如都用
shared:SSL:10m)。
为什么不能依赖文件或外部缓存?
Nginx 官方 ssl_session_cache 指令**不支持 file、redis、memcached 等外部存储**。所谓“文件缓存”是误解——早期某些定制版或第三方模块(如 nginx-ssl-cache)曾尝试支持,但主线 Nginx 从未提供。若需分布式 TLS session 共享(如跨机器集群),必须借助 TLS ticket(ssl_session_tickets on)或应用层会话透传(如 ALPN + 自定义协议),而非修改 ssl_session_cache。
验证共享是否生效的方法
可通过 Nginx 内置状态页或日志辅助判断:
- 启用
ssl_prefer_server_ciphers on和详细日志:log_format ssllog '$ssl_protocol $ssl_cipher $ssl_session_reused';,观察$ssl_session_reused字段是否频繁出现r(reused)。 - 检查共享内存使用情况:
nginx -t && ps aux | grep nginx后查看 master 进程是否存在 shm 区域;更直接方式是用ipcs -m查看系统共享内存段(Nginx 创建的通常标记为nginx: SSL)。

















