记录一下那天晚上的排查过程。站点开了 HSTS 之后更换证书,中间有一段时间 443 不可用,蜘蛛按 http 访问被 301 到 https,https 又握手失败,日志里同一个地址出现连续跳转。

排查方向其实有限,先把可能性排一排。HSTS 让浏览器和部分爬虫记住只用 https,证书一挂就没有退路。另一种情况是更换证书时先停了 443 再装新证书,中间存在空窗。

另外,Nginx 的 301 规则没有排除 ACME 验证路径。

动手时先确认 http 到 https 的跳转条件

curl -sI http://www.example.com/ | head -5

给验证路径放行避免被 301

location ^~ /.well-known/acme-challenge/ { allow all; }

末了换证书时保持旧证书在线直到新证书验证通过

openssl s_client -connect www.example.com:443 </dev/null 2>/dev/null | grep 'Verify return code'

隔了一天再看,现象没变,说明不是偶发。

那几天正好在做别的变更,先把时间线对齐才敢动手。

改完先别撤,确认这几项。调整更换流程后握手不再中断,跳转链稳定为一跳,抓取失败率降到 0.3% 以下。

容易忽略的是,证书轮换要滚动着做,别先关端口再装,HSTS 之下那几分钟足够让蜘蛛记住失败。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189