开启会话复用需协同配置ssl_session_cache、超时策略与session tickets:cache须置于http块顶层共享,大小按真实新建会话速率×超时×0.5KB计算,tickets须启用并定期轮换密钥,超时应匹配业务重连特征。
开启会话复用不是加一行配置就能解决的事,关键在于让 ssl_session_cache、超时策略和 session tickets 三者匹配真实流量节奏。否则缓存形同虚设,CPU 该飙还是飙。
shared 缓存要跨 worker 进程共享,只能写在 http { } 最外层,与所有 server 块并列。写进某个 server 里,就变成局部缓存,各 worker 互不可见,复用率基本为零。
http { ssl_session_cache shared:SSL:20m; ssl_session_timeout 10m; }
server { ssl_session_cache shared:SSL:20m; }(仅对该域名生效,且不跨进程)server { ssl_session_cache builtin:1024; }(每个 worker 自己维护,高并发下几乎无复用)不是看 QPS,而是统计每秒真正触发全新握手的连接数(Nginx 日志中 $ssl_session_reused 值为 n 的条目)。静态资源、CDN 回源、爬虫探测这类场景,新建会话速率常是 QPS 的 2–5 倍。
shared:SSL:512m + tickets 兜底更稳妥仅靠 shared 缓存无法应对突发洪峰或客户端不支持 session ID 的情况(如微信内置浏览器、部分爬虫)。tickets 是无状态兜底:加密票据由客户端携带,服务端不存状态,天然支持跨 worker、跨重启、甚至跨机器(密钥同步后)。
ssl_session_tickets on;
ssl_session_ticket_key /etc/nginx/ssl/ticket.key;(必须是二进制文件,至少 32 字节,可用 openssl rand 48 > ticket.key 生成)worker_processes 1 + ssl_session_cache builtin:1024,并关闭 tickets(兼容性差)设太短(如默认 5 分钟),用户还没关页面就过期;设太长(如 4 小时),大量失效条目长期占位,挤占有效空间。应根据客户端典型重连窗口调整:
ssl_session_timeout 10m
30m
2m 更合适