配置ssl_session_cache shared:SSL:20m并启用ssl_session_tickets on可显著降低HTTPS握手CPU负载,通过复用会话跳过非对称加密运算,实现1-RTT或0-RTT握手,配合合理超时与TLSv1.2+协议支持,是高并发场景最有效落地手段。

直接配置 ssl_session_cache shared 并配合 session tickets,是降低高并发 HTTPS 握手 CPU 负载最有效、最落地的手段。核心目标是让大多数连接复用已有会话,跳过耗时的非对称加密运算(如 RSA 解密或 ECDHE 密钥交换),把完整握手(2-RTT)降为简短复用(1-RTT 或 0-RTT)。
必须放在 http 块的共享缓存配置
单个 worker 的内置缓存(builtin)在高并发下毫无意义——请求被不同 worker 处理时无法共享会话,复用率接近于零。真正起作用的是跨进程共享的内存区:
- 在
http{}块顶层写入:ssl_session_cache shared:SSL:20m; -
20m表示分配 20MB 共享内存,可容纳约 8–10 万个会话(按平均 2KB/会话估算) - 避免只写在某个
server{}块里,否则仅对该虚拟主机生效,且无法跨 worker 共享 - 若当前活跃连接峰值为 5 万,建议从 15m 起步;超 10 万连接,直接配 20–30m
搭配 session tickets 实现无状态复用
仅靠 shared 缓存还不够。session tickets 让客户端自己保存会话状态,Nginx 不需查表、不占缓存空间,更适合高并发短连接场景(如 API、前端资源请求):
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
- 启用票据机制:
ssl_session_tickets on; - 指定加密密钥文件:
ssl_session_ticket_key /etc/nginx/ssl/ticket.key; - 密钥必须是二进制文件,长度 ≥32 字节;建议每月轮换一次,防止长期泄露导致会话重放
- 注意:禁用
ssl_session_tickets时,必须确保shared缓存足够大,否则旧客户端(如 Android 4.x)可能频繁全握手
合理设置超时与协议支持
ssl_session_timeout 控制服务端缓存条目的生命周期,设太短等于白配;设太长又浪费内存并可能保留失效会话:
- Web 页面类流量(含浏览器刷新、标签切换):
ssl_session_timeout 10m; - 移动端 App 或长连接 API:
ssl_session_timeout 30m; - 高频短连接(健康检查、爬虫):
ssl_session_timeout 2m; - 必须搭配 TLSv1.2+:
ssl_protocols TLSv1.2 TLSv1.3;(TLSv1.0/1.1 的会话恢复效率低且不安全)
验证是否真正生效
别只看配置有没有加载,要确认复用行为真实发生:
- 用 OpenSSL 连续测试:
openssl s_client -connect example.com:443 -reconnect -servername example.com 2>/dev/null | grep "Reused\|Session-ID" - 若输出中多次出现
Reused, SSL handshake has read 0 bytes and written 0 bytes,说明命中复用 - 检查 Nginx 日志或用
nginx -T | grep ssl_session_cache确认配置已加载到 http 块 - 监控指标上,可观察
$ssl_session_reused变量(值为s表示 server-initiated reuse,t表示 ticket reuse),或通过 APM 工具对比优化前后平均ssl_handshake_time

















