直接在Nginx的http块顶层配置ssl_session_cache是提升HTTPS握手性能最有效手段,可节省50–100ms延迟并降低CPU消耗;必须唯一声明shared:SSL:Xm、配合ssl_session_timeout与ssl_session_tickets on,按HPS×超时×单槽开销精准计算缓存大小,并通过$ssl_session_reused和openssl验证复用率≥75%。

直接在 Nginx 的 http 块顶层配置 SSL 会话缓存,是提升 HTTPS 握手速度最有效、最立竿见影的手段。它能让重复连接跳过完整 TLS 握手,单次节省 50–100ms 延迟,并显著降低 CPU 消耗。
必须放在 http 块顶层,且只声明一次
shared 缓存依赖进程间共享内存,只有定义在 http { } 最外层才真正生效:
- 写在某个
server块里 → 缓存仅对该域名局部有效,无法跨 worker 进程共享 → 实际复用率趋近于零 - 多个
server中重复配置 → Nginx 静默忽略后续条目,不报错但行为不可控 - 正确写法示例:
http {
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets on;
ssl_session_ticket_key /etc/nginx/ssl/ticket.key;
}
缓存大小要按真实新建会话速率(HPS)计算
不是看 QPS,而是统计「每秒新建 TLS 会话数」(HPS),再结合超时和单槽开销估算:
- OpenSSL 1.1.1+ 约占 144 字节/槽;启用 OCSP Stapling 或长证书链时升至 2–3 KB
- 保守公式:缓存大小(MB) ≈ HPS × 超时(秒) × 单槽字节数 ÷ 1024 ÷ 1024
- 常见参考值:
• 普通静态站点(HPS ≤ 100)→shared:SSL:5m起步
• 前端资源服务或 CDN 源站(HPS ≥ 500)→ 推荐shared:SSL:20m或更高
• 十万级并发(实测峰值约 1800 HPS,有效寿命 120 秒)→ 建议起步配shared:SSL:48m
搭配 session tickets 形成无状态兜底
仅靠 shared 缓存无法应对突发流量洪峰。缓存满后新连接 fallback 到全握手,CPU 和延迟同步恶化:
-
ssl_session_tickets on启用 RFC 5077 票据机制,客户端自行携带加密票据,服务端无需存储 -
ssl_session_ticket_key必须是二进制文件(至少 32 字节),可用openssl rand 48 > /etc/nginx/ssl/ticket.key生成 - 建议每月轮换密钥:生成新 key 后 reload Nginx,旧 ticket 仍可解密复用
验证是否真正生效,不能只看配置加载
配置写对 ≠ 效果落地,必须通过真实行为确认:
- 日志中加入
$ssl_session_reused变量,统计r(复用)与.(未复用)比例,目标复用率 ≥ 75% - 用命令行测试:
openssl s_client -connect example.com:443 -reconnect,观察输出是否频繁出现Reused, SSL handshake succeeded - 执行
nginx -T查看最终生效配置,确认ssl_session_cache出现在http块顶层


















