nginx配置
nginx配置

对于没有防火前或者使用了某些基础版防火墙的小伙伴而言,限制AI爬虫、搜索引擎、普通用户的访问频次,简直非常恼火,这不,我以使用nginx服务作为例子来给大家分享一下。

一、打开宝塔面板,找到“软件商店”,继续找nginx,点“设置”

当然也可以直接打开/www/server/nginx/conf/nginx.conf 进行编辑

二、撰写配置文件

(一)在http部分,输入以下内容

我这里只是列出了部分AI爬虫、部分搜索引擎,可以根据自己的需要添加

    # 1定义 Map:区分“恶意/AI爬虫”和“普通爬虫/用户”
    map $http_user_agent $is_ai_bot {
        default         "";
        "~*GPTBot"      $binary_remote_addr; 
        "~*OAI-SearchBot" $binary_remote_addr;
        "~*Amazonbot"   $binary_remote_addr;
    }
    
    # 2. 定义 Map:区分“正规搜索引擎”
    map $http_user_agent $is_seo_bot {
        default         "";
        "~*Googlebot"   $binary_remote_addr;
        "~*Baiduspider" $binary_remote_addr;
    }

    # 3. 定义限流区
    
    # 【最严格】针对 AI 爬虫:1秒1次,不允许突发
    limit_req_zone $is_ai_bot zone=gpt_limit:10m rate=1r/s;
    # 【中等】针对 SEO 爬虫:5秒10次 (即 0.5s 1次),允许一定突发
    limit_req_zone $is_seo_bot zone=seo_limit:10m rate=10r/s;
    # 【宽松】针对所有 IP (防CC攻击/暴力破解):1秒10次
    limit_req_zone $binary_remote_addr zone=general_limit:10m rate=10r/s;
http内容设置
http内容设置

(二)在server部分,输入以下内容

location / {
        # 1. 针对 AI 爬虫限流
        # 直接写在这里,不要包在 if 里
        # 如果 $is_ai_bot 为空,这条规则会自动跳过该请求
        limit_req zone=gpt_limit burst=5 nodelay;
        # 2. 针对 SEO 爬虫限流
        limit_req zone=seo_limit burst=20 nodelay;
        # 3. 全局兜底限流
        limit_req zone=general_limit burst=50 nodelay;   
        }
server部分
server部分

(三)保存,然后重启nginx生效

三、注意事项

假设你的基础限流配置是:rate=10r/s(每秒允许10个请求,即每100毫秒1个请求),并且配置了 limit_req zone=gpt_limit burst=5 nodelay

场景:客户端在 0 毫秒内,瞬间连续发来了 7 个请求。

  • 第 1 个请求:正常处理。
  • 第 2 到第 6 个请求(共5个):触发了 burst=5,因为加了 nodelay,这5个请求不排队,立刻被处理并返回结果。
  • 第 7 个请求:因为 burst 桶的容量只有 5,已经满了,这个请求会被直接拒绝(返回 503 或自定义错误码)。

后续:
在这个突发流量过后,burst 桶会以 10r/s 的速率慢慢恢复(每 100ms 恢复 1 个名额),以便应对下一次突发流量。

注意:配置不要过分限制

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注