把几个站点放在同一台服务器、同一台云主机或者同一个 CDN 账号下,是很常见的做法。省成本、好维护,但也带来一个容易被忽略的问题:搜索蜘蛛抓取时,这几个站点其实在抢同一批资源。
蜘蛛的并发按站点算,资源却不是
从蜘蛛的角度看,每个主机名、每个站点都有自己的抓取节奏和并发上限,A 站抓得凶,不代表 B 站会被跟着加速。但从服务器的角度看,CPU、内存、数据库连接数、出口带宽、磁盘 IO 只有一份。A 站被密集抓取时,B 站的响应时间会跟着上去,蜘蛛在 B 站看到的可能是变慢,甚至是超时。
几种常见的互相拖慢
- 某个站点的动态页面被密集抓取,数据库连接被占满,同机器上其他站点的页面也开始排队。
- 出口带宽被一个站点的图片或大页面吃光,其他站点的首字节时间被拉长。
- CDN 回源集中在同一段时间,源站压力叠加在一起。
- 一个站点返回 5xx,运维只看整机错误率,容易误判成整体故障。
日志不拆开,就很难看清是谁的问题
合并的访问日志里,不同站点的请求混在一起。建议按 Host 字段拆分统计,分别看每个站点的状态码分布、平均响应时间和抓取量。这样才能判断是某个站点拖累了整体,还是整体容量本来就不够。
独立域名和子目录,抓取上的区别
同一台服务器上,如果做成多个独立域名,蜘蛛会按不同站点分别评估抓取节奏,压力相对分开,代价是日志、robots.txt 和 Sitemap 都要各自维护。如果做成同一域名下的子目录,抓取节奏会被合在一起看,某个目录的内容量突然变大,可能占用同域名下其他目录的抓取机会。选哪种,取决于你是想让它们相对独立,还是想共享同一域名已有的抓取安排。
可以落地的几件事
- 按站点限速。对抓取量特别大的站点单独做并发限制或缓存,避免它吃掉全部资源。
- 静态和动态分开。把图片、CSS、JS 交给 CDN 或独立域名,源站只处理需要计算的请求。
- 逐个站点检查 robots.txt 和 Sitemap。确认没有把测试站、镜像站的入口暴露给蜘蛛,减少无意义的抓取。
- 给不承载业务的站点做减法。用合适的 robots 规则或不收录,让抓取量落在真正需要被发现的页面上。
- 保留一点余量。服务器长期跑在高负载上,遇到抓取高峰就容易出问题。
抓取预算和服务器容量是两回事
蜘蛛愿意抓多少,取决于它对站点的判断;服务器能扛多少,取决于你给了多少资源。两者不匹配时,通常不会出现一条明确的报错,而是表现为抓取速度下降、错误率上升、页面新鲜度变差。定期把日志里的抓取量和服务器监控曲线放在一起看,比单独盯着抓取频次更有用。
把多个站点放在一起没有错,错的是把它们当成一个整体来看待抓取表现。
如果某个站点的抓取状态突然变差,先别急着改内容。看一眼同一台机器上其他站点那几天的抓取量和负载曲线,很多时候答案就在那里。