压测到八百并发时 nginx 所在机器 CPU 直接跑满,抓包看每次请求都走了完整握手,一个会话都没复用。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
ssl_session_tickets on;

ssl_session_cache 默认是 none,短连接场景下每个请求都要重新协商密钥。会话票据没配 key,重启后旧票据也全部失效。这一点先确认清楚,后面就不用反复试。

「TLS 会话复用」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

具体做法是,打开共享会话缓存,大小按并发量给,别只写 off;配好 session ticket key,多台后端要保持一致,否则复用到另一台就失效;改完用 s_client -reconnect 看是否复用同一个会话。

改完照着核一遍,s_client -reconnect 显示 Reused,压测时 CPU 占用明显下降。

作者 9823189