蜘蛛抓取导致服务器负载过高怎么解决?
蜘蛛抓取致服务器负载过高时,先查访问日志定位高频IP与UA并反查验证真假,再用robots.txt和站长平台降低合规蜘蛛抓取频次,并在Nginx限制单IP请求速率与并发,避免误伤百度、Google正常收录。
学完这篇,你能从访问日志里定位是哪只蜘蛛在抓、用 robots 协议、Nginx 限速、CDN/WAF 和缓存把服务器负载压下去,同时尽量不误伤百度、Google 的正常收录。
第一步:先确认是谁在抓,拿到高频 IP 和 UA 清单
这一步要从日志里找出访问量最大的 IP、User-Agent 和 URL,做完后你会知道是正常搜索引擎、伪装蜘蛛,还是采集器。
Nginx 默认日志在 /var/log/nginx/access.log。执行:
tail -n 100000 /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20
tail -n 100000 /var/log/nginx/access.log | grep -i -E 'spider|bot' | awk -F'"' '{print $6}' | sort | uniq -c | sort -nr | head -20
如果看到某个 IP 一分钟几百次请求,或 UA 写着 Baiduspider 但 IP 不是百度的,就重点查它。
注意:不要一上来就封整个网段,百度、Google、Bing 的 IP 会变化,误封会直接掉收录。
第二步:验证蜘蛛真假,别只看 User-Agent
这一步用反向解析确认蜘蛛身份,做完后你能分出“真百度”“真 Google”和“假蜘蛛”。
以 Googlebot 为例,先反查 IP:
dig -x 66.249.66.1 +short
如果返回 crawl-66-249-66-1.googlebot.com.,再正向查:
dig crawl-66-249-66-1.googlebot.com +short
返回原 IP 才算真 Googlebot。百度蜘蛛则看反查是否落在 baidu.com 域名,并对照百度搜索资源平台公布的 IP 段。
注意:只凭 UA 含
Baiduspider就放行,等于给采集器开门。
第三步:用 robots.txt 和站长平台降低抓取频率
这一步告诉合规蜘蛛少抓动态页、降低频率,做完后无效请求会明显减少。
在网站根目录创建或修改 /robots.txt:
User-agent: *
Disallow: /search
Disallow: /*?*
Crawl-delay: 10
Sitemap: https://example.com/sitemap.xml
百度搜索资源平台入口:登录后进入“普通收录” → “抓取频次” → “抓取频次上限”,把上限调低。Bing Webmaster Tools 入口:“配置我的站点” → “抓取控制” → “抓取速度”。
注意:Google 不支持
Crawl-delay,别指望它生效;也不要写Disallow: /,那会屏蔽全站。
第四步:Nginx 层做限速和限并发
这一步在 Web 服务器上限制单 IP 请求速率,做完后即使蜘蛛再来,CPU 和数据库压力也不会瞬间打满。
编辑 /etc/nginx/nginx.conf,在 http {} 中加入:
limit_req_zone $binary_remote_addr zone=spider:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=conn:10m;
在 server {} 的 location / 中加入:
limit_req zone=spider burst=5 nodelay;
limit_conn conn 10;
保存后执行:
nginx -t && systemctl reload nginx
注意:别把 CSS、JS、图片限得太死,蜘蛛渲染页面失败会影响收录;静态资源尽量交给 CDN。
第五步:用 CDN/WAF 拦截恶意爬虫
这一步在源站前面挡掉高频恶意请求,做完后源站带宽和连接数会下降。
Cloudflare 控制台路径:选择域名 → Security → WAF → Rate limiting rules → Create rule。设置 URI Path 为 /,速率 100 requests per 1 minute,动作选 Managed Challenge 或 Block。再进入 Security → Bots → 开启 Bot Fight Mode。
宝塔面板 7.9/8.0 入口:网站 → 设置 → 防火墙 → CC 防御,添加 URL 防护规则。
注意:Bot Fight Mode 可能误伤 API、监控和支付回调,先观察 24 小时再加强。
第六步:优化缓存,让蜘蛛抓静态结果
这一步减少每次抓取触发的 PHP 和 MySQL 查询,做完后同样的抓取量下负载更低。
WordPress 可装 WP Super Cache,入口:设置 → WP Super Cache → 启用缓存。Nginx 可开 FastCGI Cache,在 server {} 中配置:
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=phpcache:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
响应头加:
add_header Cache-Control "public, max-age=3600";
注意:用户登录页、购物车、后台不要缓存。
第七步:确认恶意 IP 后直接封锁
这一步对验证为假的蜘蛛或高频 IP 做拒绝,做完后能立刻缓解。临时封单个 IP:
iptables -I INPUT -s 1.2.3.4 -j DROP
Nginx 中也可写:
deny 1.2.3.4;
deny 1.2.3.0/24;
Cloudflare 路径:Security → WAF → Tools → IP Access Rules,填入 IP 并选 Block。
注意:封之前用
whois 1.2.3.4确认归属,别把 CDN 回源 IP 或公司出口 IP 封了。
小结
- 先用日志找高频 IP、UA、URL,再验证蜘蛛真假。
- 合规蜘蛛用 robots、百度抓取频次、Bing 抓取速度降频。
- Nginx 用
limit_req、limit_conn限速限并发。 - Cloudflare、宝塔防火墙可挡恶意爬虫,但先设挑战别直接全封。
- 缓存和静态化能从源头降低每次抓取的数据库开销。
- 封锁 IP 前先
whois确认,避免误伤搜索引擎和 CDN。
原文链接:https://www.gj0.com/thread-1682.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。