个人网站被爬虫刷流量,简单防护方案
个人网站被爬虫刷流量,最直接的影响是带宽跑满、服务器负载升高,甚至产生额外费用。
本文面向零基础站长,从判断是否被恶意爬虫攻击开始,逐步给出Nginx限速、防火墙封禁、CDN防护等可落地的操作方案,帮你用最低成本挡住大部分刷量行为。
先判断是不是真被刷了
不要一看到流量上涨就认定是爬虫,先看访问日志确认特征。
登录服务器,用以下命令查看访问量最高的IP:
awk '{print $1}' /www/wwwlogs/access.log | sort | uniq -c | sort -rn | head -20
如果某个IP或某段IP的请求数远超正常用户,且User-Agent是python-requests、curl、Go-http-client等非浏览器标识,基本可以确定是爬虫。
再看请求频率:
awk '{print $1}' /www/wwwlogs/access.log | sort | uniq -c | sort -rn | awk '$1>100 {print}'
统计单IP每秒请求数,正常用户不会超过5次/秒,超过20次/秒的几乎都是爬虫。
关键结论:单IP每秒请求超过20次,或User-Agent明显非浏览器,就可以按恶意爬虫处理。
Nginx层限速与封禁
这是最直接且对正常用户影响最小的方案。
限制单IP请求频率
在Nginx主配置的http块中添加限速区域:
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
然后在网站配置的server块中引用:
location / {
limit_req zone=perip burst=20 nodelay;
limit_req_status 429;
}
含义是单IP每秒最多10个请求,突发允许20个,超出返回429状态码。
宝塔面板用户可在“网站-设置-配置文件”中直接修改。
封禁恶意User-Agent
在server块中添加:
if ($http_user_agent ~* (python-requests|curl|Go-http-client|Scrapy|Bytespider)) {
return 403;
}
注意不要误封Baiduspider和Googlebot,除非你确认不需要搜索引擎收录。
避坑:if指令在location中使用有性能问题,建议放在server层级,且只做简单判断。
防火墙与CDN补充防护
如果Nginx层拦截后仍有漏网之鱼,可以叠加系统防火墙规则。
使用iptables封禁高频IP:
iptables -I INPUT -s 恶意IP -j DROP
批量封禁C段:
iptables -I INPUT -s 1.2.3.0/24 -j DROP
宝塔用户可在“安全-防火墙”中添加IP黑名单。
如果网站已接入CDN,优先在CDN控制台设置:
- 频率限制:单IP每分钟请求数上限
- User-Agent黑名单:拦截常见爬虫标识
- CC防护:开启中等或严格模式
判断条件:如果服务器直接暴露公网IP,iptables是最后一道防线;
如果已用CDN,优先在CDN层拦截,避免流量打到源站。
验证防护是否生效
配置完成后,用以下方式确认:
- 用
curl模拟高频请求,看是否返回429或403:
for i in $(seq 1 50); do curl -s -o /dev/null -w "%{http_code}\n" https://你的域名/; done
- 观察日志中429和403的比例是否上升,正常用户请求是否不受影响。
- 查看服务器带宽监控,确认流量回落到正常水平。
操作结果:正常用户访问不受影响,恶意爬虫请求被限速或拒绝,带宽和负载明显下降。
常见疑问
限速会不会影响搜索引擎收录?
主流搜索引擎爬虫有独立IP段和User-Agent,建议在Nginx中为Baiduspider和Googlebot单独放行,不参与限速。
封禁IP后爬虫换IP怎么办?
短期封禁可缓解,长期需要结合频率限制和CDN的智能防护。
如果攻击持续,建议开启CDN的CC防护并调高等级。
小网站有必要用CDN吗?
如果服务器带宽有限且经常被刷,CDN的流量清洗能力比单机防护更有效,成本通常低于直接升级带宽。
日志文件太大怎么快速分析?
可以用goaccess工具实时查看,或按天切割日志后只分析最近几小时的数据。
宝塔面板自带日志分析功能,路径在“网站-日志”中。
防护方案不需要一次全上,建议先做Nginx限速和User-Agent封禁,观察效果后再决定是否叠加防火墙或CDN。
每调整一次配置,记得用nginx -t测试语法并重载服务。