nginx ssl会话缓存无需手动清理,其过期由ssl_session_timeout控制(如4h),超时后自动失效;共享内存区(如shared:ssl:10m)采用惰性淘汰与lru式内存回收,无inactive机制,不支持磁盘缓存或定时扫描。

Nginx 本身不提供“定期清理过期 SSL 会话缓存”的独立配置项,因为 SSL 会话缓存(ssl_session_cache)的过期与清理是由 Nginx 内置机制自动管理的,不依赖定时任务或外部脚本。
它的清理逻辑和关键配置如下:
SSL 会话缓存的过期机制靠 ssl_session_timeout 控制
该指令定义每个 SSL 会话在缓存中最多存活多久,从会话建立开始计时(不是按最后访问时间)。
一旦超时,该会话条目会被标记为无效;Nginx 在后续握手或周期性内存整理时自动淘汰。
http {
ssl_session_cache shared:SSL:10m; # 分配 10MB 共享内存存储会话
ssl_session_timeout 4h; # 会话有效期为 4 小时(默认 5m)
}
-
shared:SSL:10m表示创建一个名为SSL、大小为 10MB 的共享内存区,供所有 worker 进程共用。 -
ssl_session_timeout 4h是决定“过期时间”的唯一核心参数——超过这个时间未被复用的会话,将不再被服务端接受(客户端尝试复用时会被拒绝,触发新握手)。
清理不是“定时扫描删除”,而是惰性淘汰 + 内存回收
Nginx 不会像 proxy_cache_path inactive= 那样主动遍历并物理删除 SSL 缓存条目。它的行为是:
- 新建会话时,若共享内存已满,自动驱逐最老的(LRU-like)有效条目;
- 超时的条目在下次握手校验时被跳过,不参与复用;
- reload 或重启后,整个
ssl_session_cache内存区清空(但这是非预期操作,不用于日常清理)。
没有 inactive、没有 max_size、不能按访问热度清理
⚠️ 注意:
-
ssl_session_cache不支持inactive参数(那是proxy_cache_path的特性); - 它也没有磁盘落盘机制,全部驻留内存,因此不存在“磁盘文件过期需清理”的问题;
- 无法针对单个域名或路径设置不同 timeout,它是全局或 server 级配置。
如何验证和调优
- 查看是否启用:响应头中不会体现,但可通过
openssl s_client -reconnect观察Reused, TLSv1.3或Session-ID:是否一致来判断复用效果; - 监控内存使用:
nginx -T | grep ssl_session_cache确认配置生效,再结合pstack $(pidof nginx)或cat /proc/$(pidof nginx)/maps | grep ssl粗略观察内存占用; - 如果发现会话复用率低或内存增长异常:
- 检查
ssl_session_timeout是否设得太短(如 1m),导致频繁新建; - 确保
ssl_session_cache大小足够(10m ≈ 可存约 4000–8000 个 TLS 1.2 会话,TLS 1.3 更少); - 避免在高并发下把 timeout 设得过大(如 24h),否则可能长期占用内存且实际复用价值低。
- 检查
不复杂但容易忽略:SSL 会话缓存的“清理”本质是超时失效 + 内存自动复用,你只需配好 ssl_session_cache 和 ssl_session_timeout,剩下的交给 Nginx 自己处理。











