搜尋抓取

一台服務器上的多個站点:蜘蛛抓取时资源是怎么被分走的

多個站点共用一台服務器时,抓取表現會互相影响:CPU、資料库连接和出口带宽只有一份。本文說明蜘蛛並發按站点計算、资源却共享的現實,以及如何用分 Host 日誌、按站限速、動静分离和逐個检查 robots 来减少互相拖累。

搜尋抓取

一台服務器上的多個站点:蜘蛛抓取时资源是怎么被分走的

把几個站点放在同一台服務器、同一台云主机或者同一個 CDN 帳號下,是很常见的做法。省成本、好维護,但也带来一個容易被忽略的問题:搜尋蜘蛛抓取时,這几個站点其實在抢同一批资源。

蜘蛛的並發按站点算,资源却不是

從蜘蛛的角度看,每個主机名、每個站点都有自己的抓取节奏和並發上限,A 站抓得凶,不代表 B 站會被跟着加速。但從服務器的角度看,CPU、内存、資料库连接數、出口带宽、磁盘 IO 只有一份。A 站被密集抓取时,B 站的响應時間會跟着上去,蜘蛛在 B 站看到的可能是變慢,甚至是超时。

几種常见的互相拖慢

  • 某個站点的動態頁面被密集抓取,資料库连接被占满,同机器上其他站点的頁面也開始排队。
  • 出口带宽被一個站点的图片或大頁面吃光,其他站点的首字节時間被拉長。
  • CDN 回源集中在同一段時間,源站压力叠加在一起。
  • 一個站点返回 5xx,运维只看整机错誤率,容易誤判成整体故障。

日誌不拆開,就很难看清是谁的問题

合並的訪問日誌里,不同站点的請求混在一起。建议按 Host 字段拆分統計,分別看每個站点的狀態碼分布、平均响應時間和抓取量。這样才能判断是某個站点拖累了整体,還是整体容量本来就不够。

獨立域名和子目錄,抓取上的区別

同一台服務器上,如果做成多個獨立域名,蜘蛛會按不同站点分別评估抓取节奏,压力相對分開,代價是日誌、robots.txt 和 Sitemap 都要各自维護。如果做成同一域名下的子目錄,抓取节奏會被合在一起看,某個目錄的内容量突然變大,可能占用同域名下其他目錄的抓取机會。選哪種,取决于你是想让它們相對獨立,還是想共享同一域名已有的抓取安排。

可以落地的几件事

  1. 按站点限速。對抓取量特別大的站点單獨做並發限制或缓存,避免它吃掉全部资源。
  2. 静態和動態分開。把图片、CSS、JS 交给 CDN 或獨立域名,源站只處理需要計算的請求。
  3. 逐個站点检查 robots.txt 和 Sitemap。確認没有把測試站、镜像站的入口暴露给蜘蛛,减少無意义的抓取。
  4. 给不承载业務的站点做减法。用合适的 robots 規則或不收錄,让抓取量落在真正需要被發現的頁面上。
  5. 保留一点余量。服務器長期跑在高负载上,遇到抓取高峰就容易出問题。

抓取预算和服務器容量是两回事

蜘蛛愿意抓多少,取决于它對站点的判断;服務器能扛多少,取决于你给了多少资源。两者不匹配时,通常不會出現一條明确的报错,而是表現為抓取速度下降、错誤率上升、頁面新鲜度變差。定期把日誌里的抓取量和服務器监控曲线放在一起看,比單獨盯着抓取频次更有用。

把多個站点放在一起没有错,错的是把它們当成一個整体来看待抓取表現。

如果某個站点的抓取狀態突然變差,先別急着改内容。看一眼同一台机器上其他站点那几天的抓取量和负载曲线,很多时候答案就在那里。