直接开启并配对合理的ssl_session_cache是规避高并发HTTPS握手CPU算力黑洞最有效手段,必须在http块顶层配置shared:SSL:10m、ssl_session_timeout 10m–4h(依场景)、ssl_session_tickets on及定期轮换的ticket.key,Linux支持shared而Windows仅支持builtin且需worker_processes 1。
直接开启并配对合理的 ssl_session_cache,是规避高并发 HTTPS 握手 CPU 算力黑洞最有效、最落地的手段。它不依赖协议升级或硬件扩容,而是让大多数连接跳过密钥交换、证书验证等密集计算,把完整握手(2-RTT)降为简短复用(1-RTT 或 0-RTT),实测可降低 TLS 层 CPU 消耗 60% 以上。
builtin 缓存每个 worker 进程独占一份,无法跨进程共享——真实部署中连接被随机分发到不同 worker,复用率通常低于 5%,形同虚设。真正起作用的是进程间共享内存:
http{} 块开头统一写:ssl_session_cache shared:SSL:10m;(名称 SSL 不可省略,用于日志与监控标识)20m 或按公式计算server{} 块里重复定义同名缓存,否则各站点互不共享,资源浪费且复用率归零默认 5m 太短,用户切网络、APP 后台唤醒、HTTP/2 空闲重连常已超时;但设成数小时又易滞留失效条目、挤占内存:
ssl_session_timeout 10m 或 20m
4h,复用窗口更宽,实测延迟下降 40%+2m,配合更大缓存容量防淘汰shared 缓存是服务端有状态存储,天然有容量瓶颈;session tickets 是无状态兜底机制——服务器加密生成票据下发给客户端,自身不保存会话数据:
ssl_session_tickets on;
ssl_session_ticket_key /etc/nginx/ssl/ticket.key;
ticket.key 必须是二进制文件,至少 32 字节(可用 openssl rand 48 > /etc/nginx/ssl/ticket.key 生成)系统能力决定你能不能用“共享”缓存,不能套用同一配置:
shared:SSL:10m,配合 ssl_session_timeout 和 ssl_session_tickets on
shared,若强行配置会启动报错 [emerg] invalid value "shared:SSL:10m";只能用 builtin:1024,且必须设 worker_processes 1,避免多进程缓存隔离