把几個站点放在同一台服務器、同一台云主机或者同一個 CDN 帳號下,是很常见的做法。省成本、好维護,但也带来一個容易被忽略的問题:搜尋蜘蛛抓取时,這几個站点其實在抢同一批资源。
蜘蛛的並發按站点算,资源却不是
從蜘蛛的角度看,每個主机名、每個站点都有自己的抓取节奏和並發上限,A 站抓得凶,不代表 B 站會被跟着加速。但從服務器的角度看,CPU、内存、資料库连接數、出口带宽、磁盘 IO 只有一份。A 站被密集抓取时,B 站的响應時間會跟着上去,蜘蛛在 B 站看到的可能是變慢,甚至是超时。
几種常见的互相拖慢
- 某個站点的動態頁面被密集抓取,資料库连接被占满,同机器上其他站点的頁面也開始排队。
- 出口带宽被一個站点的图片或大頁面吃光,其他站点的首字节時間被拉長。
- CDN 回源集中在同一段時間,源站压力叠加在一起。
- 一個站点返回 5xx,运维只看整机错誤率,容易誤判成整体故障。
日誌不拆開,就很难看清是谁的問题
合並的訪問日誌里,不同站点的請求混在一起。建议按 Host 字段拆分統計,分別看每個站点的狀態碼分布、平均响應時間和抓取量。這样才能判断是某個站点拖累了整体,還是整体容量本来就不够。
獨立域名和子目錄,抓取上的区別
同一台服務器上,如果做成多個獨立域名,蜘蛛會按不同站点分別评估抓取节奏,压力相對分開,代價是日誌、robots.txt 和 Sitemap 都要各自维護。如果做成同一域名下的子目錄,抓取节奏會被合在一起看,某個目錄的内容量突然變大,可能占用同域名下其他目錄的抓取机會。選哪種,取决于你是想让它們相對獨立,還是想共享同一域名已有的抓取安排。
可以落地的几件事
- 按站点限速。對抓取量特別大的站点單獨做並發限制或缓存,避免它吃掉全部资源。
- 静態和動態分開。把图片、CSS、JS 交给 CDN 或獨立域名,源站只處理需要計算的請求。
- 逐個站点检查 robots.txt 和 Sitemap。確認没有把測試站、镜像站的入口暴露给蜘蛛,减少無意义的抓取。
- 给不承载业務的站点做减法。用合适的 robots 規則或不收錄,让抓取量落在真正需要被發現的頁面上。
- 保留一点余量。服務器長期跑在高负载上,遇到抓取高峰就容易出問题。
抓取预算和服務器容量是两回事
蜘蛛愿意抓多少,取决于它對站点的判断;服務器能扛多少,取决于你给了多少资源。两者不匹配时,通常不會出現一條明确的报错,而是表現為抓取速度下降、错誤率上升、頁面新鲜度變差。定期把日誌里的抓取量和服務器监控曲线放在一起看,比單獨盯着抓取频次更有用。
把多個站点放在一起没有错,错的是把它們当成一個整体来看待抓取表現。
如果某個站点的抓取狀態突然變差,先別急着改内容。看一眼同一台机器上其他站点那几天的抓取量和负载曲线,很多时候答案就在那里。