正确配置需在http块顶层设ssl_session_cache shared:ssl:10m、ssl_session_timeout 4h和ssl_session_tickets on,配合ticket密钥轮换与复用率监控,才能显著提升https握手复用率。

直接在 http 块顶层配置 ssl_session_cache shared:SSL:10m,配合 ssl_session_timeout 4h 和 ssl_session_tickets on,就能显著提升全站 HTTPS 握手复用率,降低延迟与 CPU 消耗。
必须统一放在 http 块顶层
该指令只在 Nginx 的 http { } 上下文中生效,且必须是全局配置:
- 写在某个
server块里 → 缓存仅对该域名局部有效,无法跨 worker 进程共享 → 实际复用率趋近于零 - 使用
builtin:1000→ 每个 worker 自己维护小缓存,不共享、易淘汰、高并发下基本无效
正确写法示例:http { ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h; ssl_session_tickets on; ssl_session_ticket_key /etc/nginx/ssl/ticket.key; }
合理设置缓存大小
shared 缓存不是越大越好,也不是越小越省,关键要匹配每秒新建 HTTPS 连接数(不是 QPS):
- 1MB 约支持 4000 个会话(证书链短、无 OCSP Stapling 时)
- 启用 OCSP Stapling 或证书链长 → 单条开销达 2–3KB,10m 实际仅存约 2500–3300 条
- 日均 UV 50 万以上站点建议起步 20m;静态资源密集型服务(如 CDN 源站、前端网关)建议 20m–50m
保守估算公式:
缓存大小(MB)≈ 新会话数/秒 × 超时(秒) × 0.5KB ÷ 1024
必须启用 session ticket 作无状态兜底
仅靠 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 仍可解密复用
验证是否真正生效
配置写对 ≠ 效果落地,需通过真实行为确认:
- 运行
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,说明复用成功
不复杂但容易忽略











