报错是这么冒出来的。源站只开了 RSA 2048 的证书套件,没有配 ECDSA,蜘蛛每次新建连接要多花一次完整握手,抓取统计里的平均响应时间比 CDN 节点高出 300ms。
中间走过弯路,把「TLS 会话票据没开,无法复用上一次的握手结果」当成主因,改完现象没变。
原因不止一个,得分开看。RSA 密钥交换需要更多往返,移动网络下尤其明显。也可能是keepalive 设置过短,蜘蛛每条请求都重建连接。
不容易想到的是,证书链里多带了一张根证书,握手包体积变大。
测一次完整握手耗时
curl -s -o /dev/null -w '%{time_appconnect}' https://www.example.com/
然后看服务端支持的套件
openssl s_client -connect www.example.com:443 -cipher ECDHE-RSA-AES128-GCM-SHA256 </dev/null 2>/dev/null | grep 'Cipher is'
申请 ECDSA 证书并优先协商
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
等前面都确认过,再开会话复用后复测
ssl_session_cache shared:SSL:10m;
恢复的判定其实很直接。握手耗时从 380ms 降到 90ms 左右,日志里蜘蛛的建连次数下降,抓取速率同步提升。
抓取性能不只取决于 HTML 大小,握手往返次数在长距离链路上影响更直接。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
