跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何配置 ssl_session_cache 在高并发握手压力下显著降低生产服务器的 CPU 负载

配置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、前端资源请求): php中将session保存到数据库的函数类代码 php中将session保存到数据库的函数类代码 下载 启用票据机制:
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

相关文章