直接在http块顶层配置ssl_session_cache shared:ssl:10m,配合ssl_session_timeout 10m、ssl_session_tickets on及密钥轮换,才能真正提升二次握手成功率;必须禁用builtin、按真实新建会话速率估算容量,并通过nginx -t和openssl验证实效。

直接在 http 块顶层配置 ssl_session_cache,配合合理超时、启用票据和容量估算,才能真正提升二次握手成功率——不是加了就有效,而是位置、类型、大小、时长四者必须匹配真实流量。
必须放在 http 块顶层,不能写进 server
该指令只在全局 http { } 上下文中生效。写在某个 server 块里,缓存仅对该域名局部有效,且无法跨 worker 进程共享,实际复用率趋近于零。
- 正确写法(nginx.conf 的
http区域内):ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m; - 验证是否加载成功:运行
nginx -T | grep ssl_session_cache,输出应明确显示该行位于http块中
用 shared 类型,禁用 builtin
builtin 是每个 worker 独享的小缓存(默认仅 1–2KB),不共享、易失效;高并发下几乎无法命中。生产环境必须用 shared。
- 格式为
shared:name:size,如shared:SSL:10m表示创建名为 SSL、大小为 10MB 的共享内存区 - 10MB 可容纳约 4 万–8 万个会话(取决于证书链长度与协议版本),中小业务够用;日均 UV 超 50 万建议调至 20m–50m
超时时间要贴合用户行为,不是越长越好
超时设太短(如默认 5 分钟),用户切换网络或页面子资源请求容易错过复用窗口;设太长(如 4 小时),可能引发内存碎片或合规风险。
- 普通 Web 站点(含移动端):推荐
ssl_session_timeout 10m或20m - 内网 API 网关、可信后台系统:可设为
30m–2h,实测可降握手延迟 40% 以上 - 金融/政务类系统:建议
5m–10m,兼顾安全窗口与可用性
必须启用 session tickets 作无状态兜底
仅靠 shared 缓存无法应对突发洪峰——缓存满后新连接 fallback 到全握手,CPU 和延迟同步恶化。
- 添加
ssl_session_tickets on;启用 RFC 5077 票据机制,客户端自行携带加密票据,服务端无需存储状态 - 配套生成密钥:
openssl rand 48 > /etc/nginx/ssl/ticket.key,密钥需为二进制文件、至少 32 字节 - 建议每月轮换:生成新 key 后
nginx -s reload,旧 ticket 仍可解密复用
不复杂但容易忽略:配置加载成功 ≠ 实际复用生效。务必用 openssl s_client -connect example.com:443 -reconnect 观察 Reused, SSL handshake succeeded 出现频次,再结合日志变量 $ssl_session_reused 统计复用比例。











