搜尋抓取

蜘蛛连上服務器之前:DNS、TLS 與首字节時間對取頁效率的影响

蜘蛛取一個頁面,並不只是發出請求然後等待 HTML。在真正传輸内容之前,還要经過域名解析、建立连接、TLS 握手等环节。這些步骤平时不顯眼,一旦變慢或失敗,就會表現為抓取變慢、超时增多,甚至让蜘蛛降低来訪频率。本文按顺序拆解這些连接阶段,並给出可落地的排查思路。

搜尋抓取

蜘蛛连上服務器之前:DNS、TLS 與首字节時間對取頁效率的影响

我們谈蜘蛛抓取时,注意力常放在 HTML、内鏈和 Sitemap 上,但蜘蛛在拿到第一個字节之前,還要先完成一连串连接動作。這些動作平时很快,快到没人注意;可一旦某個环节抖動,表現出来就是抓取變慢、超时變多,甚至来訪频次下降。

一次取頁,前後分成几段

把蜘蛛取頁拆開看,大致是:解析域名、建立 TCP 连接、TLS 握手(HTTPS)、發送請求、等待服務器返回首字节、传輸内容、關閉或复用连接。任何一段拖長,整次取頁就被拖長。

DNS 解析:第一步就容易出問题

蜘蛛要先知道域名指向哪台服務器。如果權威 DNS 响應慢、不稳定,或者返回的记錄互相矛盾,抓取在第一跳就可能失敗。常见情况包括:

  • 解析服務商节点覆盖不足,某些地区解析超时;
  • 同时配置了多條 A 记錄,其中一條指向已下线或無法訪問的 IP;
  • TTL 設定過短,解析频繁回源,遇到波動就影响可用性;
  • 域名解析與 CDN 配置脱节,蜘蛛拿到的是舊地址。

這些問题的表現往往是間歇性的:一部分抓取正常,一部分超时。日誌里看到的是超时或连接失敗,而不是 4xx、5xx。

TLS 握手與證书

HTTPS 站点在连接之後要做 TLS 握手。證书過期、證书鏈不完整、SNI 配置不一致,都可能让握手失敗,蜘蛛直接拿不到頁面。另外,服務器如果同时支持很老的加密套件,或對握手做了過多限制,也會增加失敗概率。

维護上可以關注几点:證书到期時間提前設定提醒;中間證书要一並下發,別只装叶子證书;換了證书或換了證书颁發机构之後,用外部工具從多個地区驗證一次握手是否正常。

首字节時間:服務器處理有多快

請求發出去後,蜘蛛等的是第一個字节。首字节時間包含服務器排队、應用處理、後端查询、模板渲染等耗时。它偏高的常见原因有:

  • 資料库慢查询或缺少合适索引,頁面每次都要重新計算;
  • 缓存命中率低,動態頁面占比高;
  • 應用與資料库之間網絡延迟大;
  • 同一時間有大量請求涌入,服務器排队等待。

首字节時間不是越低越好,但持續偏高意味着蜘蛛每次取頁都要占用更久的连接,單位時間内能取的 URL 自然减少。

连接复用與並發的關系

HTTP/1.1 與 HTTP/2 在连接复用上的表現不同。HTTP/2 可以在一條连接上並行多個請求,减少重复握手;HTTP/1.1 則需要更多连接。如果服務器的连接數上限、超时時間設定不合理,抓取並發一上来就容易出現排队甚至被拒绝。

抓取變慢时,先分清是服務器處理慢還是连接建立慢。两者排查方向完全不同。

排查时可以先看什么

  1. 用多個地区的探测工具测域名解析耗时與结果是否一致;
  2. 检查證书有效期、證书鏈完整性與握手协议版本;
  3. 對比静態頁面與動態頁面的首字节時間,找出慢在應用還是後端;
  4. 看服務器日誌里超时、连接重置的比例,判断是偶發還是持續;
  5. 確認抓取高峰时段的连接數與服務器承载是否匹配。

维護上的几條建议

  • 解析记錄變更後,留出足够的 TTL 生效時間再观察抓取情况;
  • 證书與中間證书统一管理,避免临期更換;
  • 给動態頁面加合理的缓存层,降低重复計算;
  • 监控首字节時間的分位數,而不是只看平均值;
  • 服務器扩容或迁移时,同步確認解析與證书都已就绪。

连接阶段的問题往往不体現在頁面内容上,而是藏在日誌的超时里。把 DNS、TLS 與首字节時間当作抓取路径的第一段来维護,蜘蛛来到站点时,才不至于還没進门就卡住。