应按真实流量重算ssl_session_cache大小并统一在http块声明,启用ssl_session_tickets分流压力,同步清理server块冗余配置、禁用builtin、监控复用率与内存使用率。

直接调小 ssl_session_cache 的共享内存大小,同时确保它只在 http 块顶层声明一次,并启用 ssl_session_tickets 分流压力——这不是简单删数字,而是按真实流量重新算容量。
先确认是不是真被缓存拖垮了
别一看到启动失败就改配置,先验证问题根源:
- 运行
nginx -T | grep "ssl_session_cache.*shared",提取出类似shared:SSL:512m的声明值 - 用
free -h查剩余内存;如果可用 RAM 小于声明值的 1.2 倍(比如声明 256m,但只剩 280MB),就极可能触发 OOM - 检查是否还启用了其他共享区,比如
proxy_cache_path keys_zone=cache_one:128m,把它们加起来看总占用 - 容器环境要核对
--memory或 Kubernetes 的resources.limits.memory是否覆盖了所有共享内存需求
按公式重算合理大小
别拍脑袋填 10m 或 256m,用业务数据反推:
- 统计峰值每秒新建 HTTPS 连接数(不是 QPS,是
$ssl_handshake_time非空出现频次) - 取
ssl_session_timeout值(推荐 10–20 分钟,即 600–1200 秒) - 套公式:所需 MB ≈ QPS × timeout × 0.5KB;例如 800 新会话/秒 × 600 秒 × 0.5KB ≈ 240MB
- 证书链长或开了 OCSP Stapling?单条开销可能达 2–3KB,按比例上调结果
- 最终向上取整到 32m / 64m / 128m 步进(如算得 241MB,配
shared:SSL:256m,不写 241m)
必须同步调整的几项
单改 cache 大小容易白忙活,这几处要一起动:
- 把所有
server块里的ssl_session_cache全删掉,只保留在http块开头一行,且名称统一为SSL - 加上
ssl_session_tickets on;和ssl_session_ticket_key /path/to/key;,让多数复用走无状态票据,减轻共享内存负担 - 禁用
ssl_session_tickets off的旧习惯——它在 TLS 1.3 下反而增加 CPU,且现代客户端支持良好 - 避免混用
builtin,像builtin:500 shared:SSL:10m这种写法中 builtin 基本闲置,纯属干扰
上线后盯紧两个指标
配置生效后,靠日志和监控验证效果:
- 在
log_format中加入$ssl_session_reused,观察r(复用)与.(未复用)的比例;长期低于 60%,说明缓存还是太小 - 用
free -m或nginx_stub_status查看共享内存实际使用率;长期低于 20%,说明分配过量,可再下调 - 对比调优前后 CPU 使用率,尤其关注握手密集时段,看 TLS 相关计算是否明显下降











