Nginx屏蔽恶意蜘蛛的实用配置

第一步:问题解构
用户的核心诉求是“如何通过Nginx规则屏蔽蜘蛛”。这可以拆解为两个核心子问题:

  1. 屏蔽哪些蜘蛛? 需要识别哪些是“垃圾蜘蛛”或需要屏蔽的非必要爬虫。
  2. 如何用Nginx实现屏蔽? 需要具体的配置规则、语法和操作方法。

第二步:方案推演与生成
基于对问题的解构,我们将结合技术知识与参考资料,分步构建答案。

1. 需要屏蔽的常见蜘蛛(User-Agent)列表

并非所有搜索引擎蜘蛛都需要屏蔽。对于中文网站,应重点屏蔽那些不带来流量、只为采集数据(如外链、SEO数据)而大量消耗服务器资源的爬虫。参考日志分析和行业实践,以下是一些常见建议屏蔽的蜘蛛:

蜘蛛名称 (User-Agent)所属机构/用途屏蔽原因参考来源
MJ12botMajestic-12 (外链查询服务)采集外链数据用于商业分析,不带来流量,爬取积极。 
AhrefsBotAhrefs (SEO分析工具)爬取频次高、深度深,主要用于分析外链和排名,对中文站无引流价值。, ,
SemrushBotSEMrush (SEO数据分析工具)原理类似,爬取全网进行数据分析,对中文站长意义不大。 
DotBot / DotBot/1.1不详 (常见于采集站)常被归类为内容采集或垃圾蜘蛛,消耗资源。, ,
Bytespider字节跳动搜索(海外版)对于非目标市场网站,其爬取可能造成不必要的负载。 
YandexBot俄罗斯Yandex搜索引擎若网站无俄语用户或不需要在Yandex收录,可考虑屏蔽。,
其他非常见或明确标识的采集器各类内容采集、扫描工具MauiBot, PetalBot (华为搜索,按需) 等,根据服务器日志分析决定。,

注意:对于 Baiduspider (百度)、Googlebot (谷歌)、Bingbot (必应)、Sogou Spider (搜狗)、 360Spider (360) 等主流搜索引擎蜘蛛,通常不应屏蔽,除非有特殊原因(如爬取过于频繁需限流),否则会影响网站在搜索引擎的收录和排名。

2. Nginx屏蔽蜘蛛的配置方法

Nginx主要通过识别HTTP请求头中的 User-Agent 字段来屏蔽特定蜘蛛。常用方法是在 serverlocation 配置段中,使用 if 指令和 returnaccess 指令。以下是几种典型的配置方式。

方法一:直接返回444状态码(推荐)

444是Nginx自定义的非标准状态码,表示直接关闭连接,不发送任何响应头,能最有效地节省服务器资源。

# 在 server { } 块内添加以下配置
server {
    listen 80;
    server_name yourdomain.com;
    ...

    # 屏蔽垃圾蜘蛛的User-Agent
    if ($http_user_agent ~* (MJ12bot|AhrefsBot|SemrushBot|DotBot|Bytespider|YandexBot)) {
        return 444;
    }

    # 更全面的屏蔽规则,包含更多常见垃圾采集器
    # 可以根据日志分析结果,将需要屏蔽的蜘蛛UA添加到括号内的正则表达式中
    # 符号说明:`~*` 表示不区分大小写的正则匹配,`|` 是或的关系
    if ($http_user_agent ~* (MJ12bot|AhrefsBot|SemrushBot|DotBot|Bytespider|YandexBot|MauiBot|PetalBot|Barkrowler|BLEXBot)) {
        return 444;
    }

    ...
}

代码关键注释:此规则利用Nginx的if指令和正则匹配~*,当请求的User-Agent包含列表中任意一个关键词时,立即返回444状态并断开连接,高效阻止爬虫访问。

方法二:拒绝访问并返回403状态码

此方法会返回一个标准的HTTP 403 Forbidden错误页面。

server {
    ...
    # 屏蔽特定蜘蛛,返回403禁止访问
    if ($http_user_agent ~* (AhrefsBot|MJ12bot)) {
        return 403;
        # 或者使用: deny all; (但需注意作用域)
    }
    ...
}

方法三:使用map指令进行更优雅的管理(适用于规则较多时)

当需要屏蔽的User-Agent列表很长时,使用map指令可以使配置更清晰、易于管理。

# 在http { } 块内定义map映射
http {
    map $http_user_agent $bad_bot {
        default 0;
        ~*(MJ12bot|AhrefsBot|SemrushBot|DotBot|Bytespider) 1;
        ~*(MauiBot|PetalBot|Barkrowler|BLEXBot) 1;
        # 可以继续添加更多规则
    }

    server {
        listen 80;
        server_name yourdomain.com;

        # 使用map的结果进行判断
        if ($bad_bot) {
            return 444;
        }
        ...
    }
}

代码关键注释:map指令将变量$http_user_agent映射为自定义变量$bad_bot。当匹配到定义的垃圾蜘蛛时,$bad_bot值为1,随后在server块中判断并执行屏蔽。

3. 操作步骤与验证

  1. 备份配置文件:在修改前,务必备份当前的Nginx配置文件(如 nginx.conf 或站点配置文件)。
  2. 编辑配置文件:将上述任一种配置规则添加到目标站点的Nginx配置文件中(通常在 /etc/nginx/conf.d//etc/nginx/sites-available/ 目录下)。
  3. 检查语法并重载
    # 检查配置文件语法是否正确
    nginx -t
    # 如果语法检查通过,重载Nginx使配置生效
    nginx -s reload
    
    操作说明:nginx -t 是至关重要的步骤,可以防止因配置错误导致服务崩溃。
  4. 验证效果
    • 查看Nginx的访问日志(如 /var/log/nginx/access.log),观察目标蜘蛛的访问是否已被拦截(返回444或403状态码)。
    • 可以使用 curl 命令模拟蜘蛛访问进行测试:
      curl -I -A "AhrefsBot" http://yourdomain.com
      
      代码关键注释:-A参数用于指定User-Agent。如果配置生效,应收到444(无响应)或403状态码。

4. 高级补充:结合robots.txt进行双重防护

除了在服务器层面使用Nginx屏蔽,还可以在网站根目录的 robots.txt 文件中声明拒绝这些蜘蛛抓取。这是一种行业标准,但依赖于爬虫的自律性,恶意爬虫可能无视此文件。因此,Nginx规则是更主动和强制的防护手段。

# robots.txt 示例
User-agent: MJ12bot
Disallow: /
User-agent: AhrefsBot
Disallow: /
User-agent: SemrushBot
Disallow: /

将Nginx技术屏蔽与robots.txt声明结合使用,可以构建更立体的防护体系。

总结:通过分析服务器日志确定需要屏蔽的蜘蛛User-Agent列表,然后选择适合的Nginx配置方法(推荐使用return 444;)将其添加到服务器配置中,最后经过语法检查和重载生效。这种方法能有效降低非必要爬虫带来的服务器负载和资源消耗,是网站运维中一项基础且重要的安全与性能优化措施。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值