这类问题我又碰上了一次。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,太短等于没开。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
