很多人排查蜘蛛池入口页的抓取问题,习惯从内容和内链入手,却忽略了更靠前的一步:TLS 握手。蜘蛛必须先建立连接、完成证书校验,才有机会看到你的 HTML。握手阶段出问题,后面做得再好也没有用。
为什么证书问题在蜘蛛池里被放大
普通站点通常只有一个域名、一张证书,出问题容易发现。蜘蛛池动辄几十上百个入口页,域名分散、可能分布在多台服务器上,证书往往是批量签发、批量部署的。批量就意味着容易漏:漏一个域名、漏一条中间证书、漏一次续期,都不会有人立刻发现,但蜘蛛会。
更关键的是,不同抓取客户端的容错策略不一样。有的对证书链不完整比较宽容,有的直接放弃;有的支持 SNI,有的在旧版本上不支持。你并不容易知道对面那台机器用的是哪一套。
几类高频的证书故障
证书链不完整
服务器只发了站点证书,没带中间证书。浏览器可能靠缓存或 AIA 补链自动修好,看起来一切正常;但蜘蛛请求往往没有缓存,也不一定支持 AIA 抓取,于是握手直接失败。这种情况最容易被误判成“服务器不稳定”或“蜘蛛不来”,实际原因在配置里。
排查办法是用 openssl s_client -connect 域名:443 -servername 域名 查看返回的证书链是否完整。
域名不匹配与通配符边界
通配符证书只覆盖一级子域名,*.example.com 并不覆盖 a.b.example.com。如果入口页用了多级子域,或者证书里写的是裸域、入口页却挂在 www 子域上,就会出现名称不匹配。名称不匹配在多数客户端上是硬失败,而不是可以忽略的警告。
续期失败与静默停止
自动签发的证书有效期普遍不长,依赖定时任务续期。定时任务因为权限、端口占用、校验方式变更等原因停掉之后,通常没有任何告警,直到证书到期当天全站握手失败。建议至少做两件事:把到期时间纳入监控并在剩余 15 天时提醒;续期成功后自动重载服务,避免新证书写好了但进程还在用旧的。
SNI、TLS 版本与被忽略的兼容性
同一台服务器上放多个入口页域名时,靠 SNI 区分证书。绝大多数现代抓取客户端支持 SNI,但如果接入层配置了 SNI 缺失时的默认站点,可能会把请求导向错误的证书或错误的内容。可以在检测工具里关掉 SNI 试一次,看看返回什么。
另一个方向是 TLS 版本与加密套件。为了安全收紧到只允许较新协议本身没问题,但如果你同时用了较老的抓取工具或自建检测脚本,可能会看到握手失败。这部分建议以真实日志为准,而不是凭猜测放开旧协议。
混合内容与协议层面的反复跳转
即使 HTTPS 握手正常,页面里引用 http:// 的图片、脚本、样式,也可能让部分客户端在加载子资源时出错,甚至影响它对页面完整性的判断。更常见的是协议跳转没理顺:http 到 https 跳一次,带 www 又跳一次,结尾斜杠再跳一次,一个入口页要跳三跳才落地。跳转本身不致命,但它消耗抓取预算,也增加了链路上任一环出错的机会。
建议把入口页的最终 URL 固定成唯一的规范形式,其他变体用一次性跳转收敛过去。
一个可执行的排查顺序
- 用外部工具从公网检测证书链、有效期与域名匹配,不要只在服务器本机用 curl 测。
- 检查是否所有入口页域名都在证书覆盖范围内,特别是多级子域。
- 确认续期任务最近一次成功时间,以及服务是否已加载新证书。
- 关掉 SNI 测一次,看默认站点返回的是哪个域名、什么内容。
- 检查页面内是否残留 http:// 资源链接。
- 最后再看跳转链,把多余的一跳去掉。
几点使用建议
- 入口页域名尽量控制在一张证书能覆盖的范围内,减少管理面。
- 把证书到期时间做成监控项,不要依赖记忆。
- 批量部署后抽样验证,而不是全部部署完就认为没问题。
- 改动 TLS 配置后,用日志观察一段时间的抓取量变化,再决定是否继续收紧。
握手是蜘蛛看到你内容的前提。它不通过,后面关于内容、内链、抓取预算的所有优化都无从谈起,而它出问题时往往没有任何明显症状。