关键是要按每秒新会话数×超时时间×0.5KB精准计算缓存大小,如800新会话/秒、20分钟超时需约384MB,而非盲目设10m;须协同配置超时时间(依业务类型设10m–60m)、启用ssl_session_tickets作无状态补充,并统一在http块顶层声明shared缓存。

要在高并发场景下让 ssl_session_cache 既保障 TLS 握手复用率,又不压垮内存,关键不是“设大一点”,而是按真实会话节奏做动态适配——缓存大小、超时时间、后端类型三者必须协同,缺一不可。
先算清每秒新会话量与内存占用关系
每个缓存条目实际占 256–512 字节(取决于证书链长度和 TLS 版本),不是固定值。若业务峰值每秒新建 800 个 HTTPS 连接,平均会话存活 20 分钟(1200 秒),理论所需缓存空间为:
- 800 × 1200 × 0.4 KB ≈ 384 MB
- 直接配
shared:SSL:10m必然溢出,命中率断崖下跌 - 建议起步按公式 cache_size ≈ new_sessions_per_sec × timeout_sec × 0.5KB 计算,再向上取整到 50m 或 100m 步进
超时时间别盲目拉长,要匹配用户行为周期
设 ssl_session_timeout 4h 看似稳妥,实则易导致大量“僵尸会话”长期占位。现代客户端重连频繁,真正复用窗口往往集中在前 5–30 分钟。
- 文章类站点(单次访问短):设
10m–20m即可 - 收银/后台系统(操作密集但单次短):推荐
15m,兼顾复用与周转 - 游戏或长连接应用:可设
30m–60m,但需配合更大缓存(如 200m+) - 超时过长反而降低缓存新鲜度,增加无效内存占用
用 session tickets 补位,卸载服务端状态压力
shared 缓存是服务端有状态存储,天然有容量瓶颈;session tickets 是无状态机制——服务器加密生成票据下发给客户端,自身不保存会话数据。
- 必须开启:
ssl_session_tickets on - 必须配密钥:
ssl_session_ticket_key /etc/nginx/ssl/ticket.key - 密钥建议每月轮换,避免长期泄露导致票据被解密重放
- 它不替代 shared 缓存,而是与之并行生效:tickets 服务新连接,shared 缓存服务老连接复用,双通道提升整体复用率
Linux 用 shared,Windows 只能靠 builtin + 单 worker
系统环境决定缓存能力上限,不能套用同一配置:
- Linux/Nginx:必须在
http块顶层统一配置shared:SSL:50m,禁止多个server块重复定义同名 cache - Windows/Nginx:不支持
shared,只能用builtin:1024,且应设worker_processes 1避免多进程间缓存隔离 - Apache 用户:优先选
shmcb后端(如SSLSessionCache shmcb:/var/cache/apache2/ssl_scache(1048576)),禁用dbm(文件锁拖慢握手)
不复杂但容易忽略:缓存效果好不好,不能只看配置有没有,而要看 $ssl_session_reused 变量的 r(reused)占比是否稳定在 70% 以上;低于 50%,基本说明缓存已失能。











