这类问题我又碰上了一次。nginx 1.22 上 HTTPS 站点首屏加载慢,用 openssl 测握手每次都要 300ms 以上,抓包看每个连接都完整走了一遍证书交换。

第一反应是「多台 nginx 之间的 session ticket key 不一致,请求漂到另一台就失效」,验证下来不成立。

排查方向其实有限,先把可能性排一排。ssl_session_cache 配成了 none,会话票据和缓存都不生效;ssl_session_tickets 被关掉,客户端没有可复用的会话;TLS 1.3 的早期数据没开,短连接场景复用率天然低。

测两次握手的耗时差异

openssl s_time -connect demo.lu0.cn:443 -new -time 10

随后确认会话缓存相关配置

grep -nE 'ssl_session_cache|ssl_session_timeout|ssl_session_tickets' /etc/nginx/nginx.conf

再往下开启共享缓存并设置超时

nginx -t && systemctl reload nginx

末了对比复用后的握手耗时

openssl s_client -connect demo.lu0.cn:443 -reconnect </dev/null | grep -i reused

同一份数据我导出了两份,一份留底,一份拿来试。

怎么算真的好了,看的是同一批现象。s_client 的 reconnect 输出里出现 Reused,握手耗时降到 50ms 以内,首屏加载时间明显缩短。

提醒一点。多机部署时 session ticket key 要统一,否则复用率上不去;开了缓存也要留够 ssl_session_timeout,太短等于没开。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189