讨论蜘蛛池的时候,很多人先盯着内容、链接和更新频率,却把一个更靠前的问题放过去了:蜘蛛的请求能不能顺利完成握手。入口页的内容再合理,如果 TLS 这一层出错,蜘蛛拿到的不是页面,而是一次连接失败。日志里甚至不会有状态码,只会留下空白的访问记录。
为什么证书问题排在最前面
蜘蛛抓取一个 URL,顺序大致是:DNS 解析、TCP 连接、TLS 握手、发送 HTTP 请求、接收响应。证书属于第三步。这一步没过,后面的状态码、响应时间、页面重量都无从谈起。所以排查入口站问题时,先确认握手是否正常,比翻内容模板更有意义。
证书链不完整:最容易被忽略的一项
服务器如果只配置了站点证书、没有带上中间证书,桌面浏览器通常会自动补链,看起来一切正常。但爬虫客户端和不少命令行工具不会做这种补救,握手会直接失败。这种情况下,人在浏览器里访问顺畅,蜘蛛那边却连不上,很容易误判成别的原因。
- 用 openssl s_client -connect 域名:443 -servername 域名 查看 verify 返回值,确认链是否完整。
- 服务器上配置的是 fullchain 文件,而不是单独的一张站点证书。
- 换过证书或迁移过服务器后,重新跑一遍检查,别默认沿用旧配置。
有效期与自动续期
证书有效期越来越短,忘记续期已经从偶发事故变成常见故障。入口站数量一多,人工盯到期日几乎必然出错。
- 给每个入口域名建到期提醒,提前至少两周。
- 能自动化签发就自动化,减少手工替换的环节。
- 续期后记得重载服务,否则新证书躺在磁盘上不生效。
证书过期当天的表现不是权重波动,而是整个入口站不可访问。这类问题没有渐变过程,只有能用和不能用两种状态。
域名匹配:泛域名并不覆盖所有子域
泛域名证书通常只覆盖一级子域,例如 *.example.com 能覆盖 a.example.com,但覆盖不了 a.b.example.com。入口站用到多级子域时,容易出现部分域名证书不匹配的情况。多域名证书则要留意后续新增域名是否被纳入,否则新加的入口站会自带一个隐患。
HTTP 到 HTTPS 的跳转:一次 301 就够
把 HTTP 流量引导到 HTTPS 是常规做法,但链路要短。一次 301 到位即可,尽量避免 301 跳 302、再跳一层的情况,也不要用 JS 跳转代替服务器跳转。跳转层数越多,蜘蛛在一次抓取中能拿到的有效信息越少。
HSTS 好用,但回退成本高
HSTS 能让浏览器和部分客户端之后强制走 HTTPS,省掉跳转,但一旦下发,回退就比较麻烦。开启 includeSubDomains 之前,要先确认所有子域都准备好了证书,否则会把没配好的子域一起锁死在 HTTPS 上。
混合内容:页面是 HTTPS,资源还是 HTTP
入口页本身走 HTTPS,但里面引用的图片、脚本、样式来自 HTTP,浏览器会拦截或降级处理。蜘蛛不一定执行渲染,但会执行渲染的抓取客户端可能拿到一个残缺页面。统一把内部资源地址改成 HTTPS 或协议相对写法,可以少一类变量。
入口站数量多时,证书怎么管
- 确定统一的证书策略:是每个站独立证书,还是集中用一张多域名证书。
- 签发、部署、重载、验证,尽量做成一条固定流程,减少手动环节。
- 入口站退役或替换时,把证书一并处理,别留下没人管的过期证书。
- 把证书到期纳入日常监控,和域名解析、服务器状态放在一起看。
上线前的自查清单
- 握手是否正常,verify 是否返回成功。
- 证书链是否完整,中间证书有没有带。
- 有效期还剩多久,续期机制是否可靠。
- 证书覆盖的域名和实际使用的域名是否一一对上。
- HTTP 到 HTTPS 是否只有一次 301。
- 页面内是否还有 HTTP 资源。
- HSTS 是否已开启,覆盖范围是否合适。
- 到期和握手失败是否有告警。
证书本身不会给入口站带来额外好处,它只是让蜘蛛能够顺利走到门口。把它当作基础设施来维护,比在上线后从抓取日志里反推故障原因要省事得多。