必须在http块顶层配置ssl_session_cache shared:ssl:20m、ssl_session_timeout 4h和ssl_session_tickets on,配合ticket密钥轮换与复用率监控,才能确保tls会话跨进程共享、无状态兜底有效、容量超时匹配真实流量。

优化 Nginx 处理 HTTPS 握手的上下文环境,核心是让 TLS 会话复用真正生效——不是只写对配置,而是确保缓存可跨进程共享、票据能兜底、超时与容量匹配真实流量。关键不在 server 块里调参数,而在 http 块顶层构建统一、稳定、可伸缩的握手上下文。
必须放在 http 块顶层统一配置
ssl_session_cache 只在 http { } 上下文中生效,且必须全局声明:
- 写在某个 server 或 location 块里 → 缓存隔离,无法跨域名/worker 共享 → 复用率几乎为零
- 用 builtin:1000 → 每个 worker 自维护小缓存,高并发下频繁淘汰,实际无效
- 正确写法是直接在 http 块开头设 shared 缓存,例如:
ssl_session_cache shared:SSL:20m;
配合 session ticket 实现无状态兜底
仅靠 shared 缓存扛不住突发流量:缓存满后新连接被迫全握手,CPU 和延迟双双飙升。
- 启用 ssl_session_tickets on,走 RFC 5077 票据机制,客户端自行携带加密票据,服务端无需查表
- 配 ssl_session_ticket_key(二进制文件,至少 32 字节),可用 openssl rand 48 > /etc/nginx/ssl/ticket.key 生成
- 密钥建议每月轮换:生成新 key 后 reload Nginx,旧票据仍可解密复用
合理设置缓存大小与超时时间
缓存不是越大越好,要按每秒新建 HTTPS 连接数(非 QPS)估算:
- 1MB shared 缓存 ≈ 支持 4000 个短链会话;若启用了 OCSP Stapling 或证书链长,单条开销达 2–3KB,10m 实际仅存约 2500–3300 条
- 日均 UV 50 万以上站点建议起步 20m;CDN 源站或前端网关建议 20m–50m
- ssl_session_timeout 推荐设为 4h(14400 秒),过短导致频繁失效,过长占用内存且复用收益下降
验证是否真正落地生效
配置写对 ≠ 效果达成,需实测确认:
- 运行 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",多次执行出现 “Reused, TLSv1.3” 即表示成功











