服务器在境外,TLS 握手平均 800ms,蜘蛛抓取频次从 3 档降到 2 档。Nginx 1.24 没开 OCSP stapling,每建一次连接都要回源查吊销状态,境外网络下这一跳特别慢。
一开始怀疑是「证书链缺中间证书,stapling 校验失败被跳过」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。ssl_stapling 没有开启,客户端要自己去查 OCSP。另一种情况是resolver 没配,开了 stapling 也拿不到响应。
不容易想到的是,会话复用关闭,每个连接都重新握手。
测一次握手的耗时
curl -s -o /dev/null -w '%{time_appconnect}\n' https://www.example.com/
随后看服务端有没有 stapling 响应
openssl s_client -connect www.example.com:443 -status < /dev/null | grep -i ocsp
接着打开 stapling 并指定 resolver
ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 valid=300s;
等前面都确认过,再开启会话复用
ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
那几天正好在做别的变更,先把时间线对齐才敢动手。
别只看报错消失,验证要多做一步。握手耗时降到 200ms 以内,stapling 输出里出现 Response verify OK,抓取频次两周内回到 3 档。
这里还有个坑。stapling 只对支持它的客户端生效,但主流蜘蛛都支持,属于成本很低的优化。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
