Nginx屏蔽采集爬虫IP:老站长硬核拆解:Nginx屏蔽采集
做了六年外贸独立站,我最恨的不是竞争对手降价,而是那群没日没夜盯着你网站“薅羊毛”的采集爬虫。有时候你辛辛苦苦调优半个月的服务器,刚看点流量起色,结果后台一看,好家伙,CPU直接飙到90%,带宽全是那些不知名的蜘蛛在疯狂抓取。面对这种“偷家”行为,Nginx屏蔽采集爬虫IP就是我们最后也是最硬的一道防线。很多新手站长觉得封IP太暴力,怕伤到SEO,但作为在一线踩过无数坑的老兵,我要告诉你:有些垃圾爬虫不封掉,你的站迟早被它们拖垮。
一、 别乱封!先分清谁是“客”谁是“贼”
在动手写Nginx规则之前,咱们得先理清楚,哪些爬虫是咱们的衣食父母,哪些是来搞破坏的。
- 正规军(SEO命脉): Googlebot、Bingbot、Baiduspider。这些是你求爷爷告奶奶请回来的,千万别手抖给封了。
- 工具类(中性): 比如AhrefsBot、SemrushBot。虽然它们很占资源,但对SEO调研有参考价值。如果服务器抗压能力强,可以留着;如果配置低,建议限流。
- 纯流氓(死敌): 各种Python脚本、Scrapy框架、无名UA(User-Agent)爬虫。这种东西纯粹是为了采集你的原创内容去搞采集站,或者扫描你的系统漏洞,直接杀无赦。
二、 实战第一招:最简单的IP拉黑(单兵作战)
如果你已经在访问日志(access.log)里抓到了现行,确定某个IP正在疯狂刷你的接口,最干脆的方法就是在Nginx里直接把它踢出去。
1. 基础语法
在Nginx的server段或者location段里加入:
# 屏蔽单个恶意IP
deny 123.123.123.123;
# 屏蔽一个IP段(比如某机房的恶意扫描)
deny 123.123.123.0/24;
# 允许某个信任IP,其余全屏蔽
allow 110.110.110.110;
deny all;
2. 避坑指南
- 别直接写在nginx.conf主文件: 以后你要封几百个IP,主文件会乱成一锅粥。
- 正确姿势: 创建一个专门的文件,比如
deny_ips.conf,然后在主配置里用include引入。
老站长碎碎念: “封IP是体力活,更像是在打地鼠。现在的采集者聪明得很,他们会用拨号IP或者代理IP池。如果你发现封了一个又来十个,那就不能只靠封IP了,得升级手段。”
三、 实战第二招:通过User-Agent识破伪装(降维打击)
很多低级采集程序,虽然换了IP,但它的User-Agent(UA)暴露了它的身份。比如很多Python写的脚本,默认UA里就带着python-requests。
1. 屏蔽特定的垃圾UA
在Nginx配置里加入这种判断:
if ($http_user_agent ~* (Scrapy|Curl|HttpClient|python-requests|Go-http-client)) {
return 403;
}
2. 进阶版:针对空UA或非法UA
很多恶意攻击连UA都不写,正常浏览器绝对不会这么干。
# 屏蔽空UA
if ($http_user_agent ~ ^$) {
return 403;
}
适用场景: 这种方法能挡住80%的初级采集脚本。
文案案例: 如果你发现日志里全是 GET / HTTP/1.1" 200 ... "python-requests/2.25.1",别犹豫,直接反手一个403送它走。
四、 实战第三招:限流(Rate Limiting)——温柔的驱逐
有些爬虫(比如Ahrefs)你可能不想完全屏蔽,但它抓取太猛,影响正常用户访问了。这时候我们可以用Nginx的limit_req模块,给它带上“紧箍咒”。
1. 定义限流区域
在http层级定义:
# 每秒只允许同一个IP发起5次请求
limit_req_zone $binary_remote_addr zone=anti_spider:10m rate=5r/s;
2. 应用到具体的Server
server {
location / {
# 允许超过频率的请求排队,最多存5个,不延迟处理
limit_req zone=anti_spider burst=5 nodelay;
...
}
}
老站长心得: “这一招对付那些‘伪装成正常人’的爬虫最管用。它不至于让你直接跟这些工具断交,但能保证你的服务器不会因为它们而宕机。”
五、 实战第四招:自动化防御(老站长的“自动化机枪塔”)
靠人工去日志里翻IP再手动封,这太低效了。作为一个合格的站长,得学会用工具。我推荐两个黄金组合:Fail2ban + Nginx。
1. 逻辑原理
Fail2ban会实时监控你的Nginx访问日志,如果发现某个IP在短时间内报错(比如连续触发403或404)达到一定次数,它就会自动调用防火墙(iptables/nftables)把这个IP封禁一段时间。
2. 简单的Fail2ban配置示例(jail.local)
[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 10
findtime = 60
bantime = 86400 # 封禁一天
这种方案的优势: 24小时无人值守,专治各种不服的暴力采集器。
六、 特别提醒:用了CDN(如Cloudflare)怎么封?
这是很多新手最容易踩的坑。如果你的网站套了Cloudflare,你直接在Nginx里获取到的IP全是Cloudflare的节点IP。如果你把这些IP封了,等于把正常访客也拒之门外了。
1. 获取真实IP
你需要在Nginx中启用real_ip模块,并告诉Nginx信任CF的IP段:
set_real_ip_from 103.21.244.0/22; # CF的IP段,记得定期更新
real_ip_header X-Forwarded-For;
2. 云端屏蔽
既然用了CDN,最好直接在Cloudflare的后台“安全性 -> WAF -> 速率限制规则”里配置。在云端就把垃圾流量洗掉,连你的服务器带宽都不会占用。
七、 总结与避坑指南
关于Nginx屏蔽采集爬虫IP,最后总结几点干货经验:
| 维度 | 建议方案 | 适用对象 | 优点 |
|---|---|---|---|
| 紧急避险 | deny IP; |
已知恶意IP | 见效极快 |
| 批量拦截 | User-Agent 过滤 |
脚本/初级爬虫 | 成本低,覆盖面广 |
| 细水长流 | limit_req 限流 |
商业爬虫/高频用户 | 兼顾SEO与稳定性 |
| 长期战役 | Fail2ban 自动化 |
暴力扫描/采集 | 自动省心 |
⚠️ 站长避坑细节:
- SEO大忌: 封禁之前,一定要去对比一下官方的爬虫IP段。万一把Googlebot封了,你哭都没地方哭。建议配合
Google Search Console查看抓取错误。 - 403 vs 444: 习惯上我们返回
403 Forbidden。但如果你想更狠一点,可以返回444。这是Nginx内置的一个非标准状态码,作用是直接关闭连接,不给对方回传任何数据,连个字节的流量都不浪费。 - 定期清理: 封禁列表不要只增不减。很多动态IP三个月后就变成正常用户了,记得定期review你的封禁名单。
作为老站长,我想说:SEO优化不只是写文章发外链,保障服务器环境的纯净同样重要。 采集器就像苍蝇,你拍得越快,你的网站才能跑得越稳。希望这套方案能帮大家守好自己的那一亩三分地。如果你在操作中遇到具体的报错,欢迎在评论区留言,咱们一起切磋。
相关文章
- 宝塔面板登录不进去怎么办:宝塔面板登录失败的自救指南
- Nginx伪静态规则写法教程:Nginx伪静态实操:从入门到避坑
- 轻量云服务器带宽不够怎么优化:小带宽也能跑大流量:轻量云服务器优化实战
- 阿里云CDN配置网站步骤:阿里云CDN实操避坑指南
- 腾讯云轻量服务器建站教程:腾讯云轻量服务器实战建站指南
- ZBlog伪静态设置方法:ZBlog伪静态设置全攻略:老站长带你避坑
- 网站被CC攻击怎么防护:网站被CC攻击?老站长教你硬核防御
- SSL证书自动续期失败解决:SSL续期失败?老站长带你填坑
- 宝塔计划任务不执行排查:宝塔定时任务失效?老站长教你闭眼排雷
- 服务器磁盘满了清理方法:告别满盘焦虑:老站长亲授Linux服务器深度瘦身大法

