很多人排查蜘蛛池入口頁的抓取問题,习惯從内容和内鏈入手,却忽略了更靠前的一步: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 配置後,用日誌观察一段時間的抓取量變化,再决定是否繼續收紧。
握手是蜘蛛看到你内容的前提。它不通過,後面關于内容、内鏈、抓取预算的所有優化都無從谈起,而它出問题时往往没有任何明顯症状。