配置ssl_session_cache shared于http块顶层,配合ssl_session_timeout 4h、ssl_session_tickets on及定期轮换的ticket.key,可显著提升https静态资源握手复用率,节省50–100ms/次。

直接在 Nginx 的 http 块顶层配置 ssl_session_cache shared,配合合理超时、启用会话票据,并按业务流量设好缓存大小,就能显著提升 CSS、JS、图片等 HTTPS 静态资源的握手复用率,节省每次约 50–100ms(1 个 RTT)。
必须放在 http 块顶层,禁用 builtin 模式
shared 缓存是多 worker 进程共用的内存区,只有定义在 http { ... } 最外层才真正生效:
- 写在某个
server块里 → 缓存仅对该域名局部有效,且无法跨进程共享 → 复用率趋近于零 - 只用
builtin:1000→ 每个 worker 自己维护一份小缓存,请求被随机分发后基本无法命中 - 正确写法示例:
http {<br> ssl_session_cache shared:SSL:10m;<br> ssl_session_timeout 4h;<br>}
缓存大小要匹配静态资源并发特征
静态资源请求高频、短连接、复连密集(如一个页面加载 20 个 HTTPS 资源),缓存太小会导致频繁淘汰、复用失败:
- 普通静态站点(QPS ≤ 100):从
shared:SSL:5m起步,1MB 约存 4000 条会话 - 前端资源服务或 CDN 源站(QPS ≥ 500):建议
shared:SSL:20m,避免因容量不足拉低复用率 - 若启用了 OCSP Stapling 或证书链较长,单条会话达 3–4KB,需同比例上调大小(例如 10m 实际仅存约 2500 条)
三项关键参数必须协同开启
光配缓存不够,以下三者缺一不可:
-
ssl_session_timeout 4h:设为较长值(默认 5m 太短),给客户端足够窗口复用;注意这是“最后活跃起 4 小时内可复用”,非强制保质期 -
ssl_session_tickets on:启用 RFC 5077 会话票据,比 Session ID 更轻量,不依赖服务端存储,天然支持跨 worker 和重启复用 -
ssl_session_ticket_key /etc/nginx/ssl/ticket.key:指定 32 字节以上二进制密钥(可用openssl rand 48 > ticket.key生成),建议每月轮换防重放
验证是否真正生效,不止看配置加载
启动不报错 ≠ 实际复用。要观察真实行为:
- 确认位置:运行
nginx -T | grep ssl_session_cache,输出应明确显示该行位于http块中 - 日志统计:在
log_format中加入$ssl_session_reused,统计 24 小时内r(reused)占比;长期低于 60% 说明缓存偏小或 timeout 过短 - OpenSSL 测试:
openssl s_client -connect example.com:443 -reconnect -servername example.com 2>/dev/null | grep "Reused\|Session-ID",出现Reused, TLSv1.2或Reused, TLSv1.3即表示命中











