Nginx 有办法对特定 ua 的请求进行速度限制吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wu67
V2EX    NGINX

Nginx 有办法对特定 ua 的请求进行速度限制吗

  •  
  •   wu67
    wu67 2024-01-31 12:00:52 +08:00 2916 次点击
    这是一个创建于 618 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT. 在服务器上建了 webdav 服务, 然后本地用 infuse 播放视频.

    但是这播放器的缓存策略好像有点问题, 会一直不停的全速缓存整个视频,

    我知道可以limit_rate ***k对 location 限速, 但是这是所有请求都限速了(有时候会想直接把文件全速下载回本地保存)

    就想问问有没有办法能针对特定 ua 进行 limit_rate ?

    14 条回复    2024-02-01 15:42:19 +08:00
    nashaofu
        1
    nashaofu  
       2024-01-31 12:27:11 +08:00 via Android
    两个功能都有的吧,组合下就可以用,if $http_user_agent ~* "ua" {}
    wu67
        2
    wu67  
    OP
       2024-01-31 12:31:51 +08:00 via Android
    @nashaofu 好像不行啊。按语法思路,声明语句不能放在条件语句 if 里面
    jinzc
        3
    jinzc  
       2024-01-31 13:26:52 +08:00
    换用 openresty , 编码识别 ua 后限制速率
    dropdatabase
        4
    dropdatabase  
       2024-01-31 13:37:42 +08:00   1
    ```
    location / {
    access_by_lua_block {
    local limit_dict = ngx.shared.my_limit_dict
    local ua = ngx.var.http_user_agent
    local limit_key = "ua:" .. ngx.md5(ua)
    local limit_count = limit_dict:get(limit_key) or 0

    -- 设置速度限制,例如每秒最多 5 个请求
    local limit_rate = 5

    if limit_count > limit_rate then
    ngx.exit(ngx.HTTP_TOO_MANY_REQUESTS)
    else
    limit_dict:incr(limit_key, 1)
    end
    }

    # 其他处理逻辑...
    }
    ```
    kaf
        5
    kaf  
       2024-01-31 13:50:40 +08:00
    http {
    # 定义一个 map 块来匹配需要限速的 User-Agent
    map $http_user_agent $limited_ua {
    default 0; # 默认情况下不进行限速
    ~*bot 10; # 匹配包含 'bot' 的 User-Agent 并限制为 10 req/s
    ~*spider 5; # 匹配包含 'spider' 的 User-Agent 并限制为 5 req/s
    }

    # 在 server 或 location 块中使用 limit_req_zone 指令来定义限速的区域
    limit_req_zone $limited_ua zOne=ua_limit:10m rate=$limited_ua;

    server {
    ...

    location / {
    # 在需要限速的 location 块中使用 limit_req 指令来实现限速
    limit_req zOne=ua_limit burst=5 nodelay;

    # 其他配置项
    ...
    }
    }
    }
    knightdf
        6
    knightdf  
       2024-01-31 14:13:40 +08:00
    用 ngx-lua module ,想怎么限制都行
    wu67
        7
    wu67  
    OP
       2024-01-31 14:28:06 +08:00
    @kaf
    @dropdatabase 懂了, 感谢.

    比较迷惑的是, 如果定义在了 location / 下面, 那么这个 server 下所有的 location 路径都会被限速, 而不是只限制根路径.
    我甚至还尝试过开另一个端口启动不限速的服务, 现在改用 map 了.

    ```
    map $http_user_agent $agent_limit_rate {
    default 0;
    "" 2048k;
    ~*infuse 2048k;
    }

    server {
    ...
    limit_rate $agent_limit_rate;
    ...
    }
    ```
    wu67
        8
    wu67  
    OP
       2024-01-31 14:31:20 +08:00
    @knightdf 可以的话我还是喜欢少点用其他模块, 尽量用自带的模块完成.

    @jinzc 长知识了, openresty 这是 nginx 的二次开发吗? 还是套壳/扩展模块的形式呀?
    pipixiadexiapi
        9
    pipixiadexiapi  
       2024-01-31 14:42:43 +08:00
    @wu67 粗浅见解,openresty 是 nginx+lua ,重在 lua 做了许多有用的模块

    另外想问问各位大佬,歪个楼,既然已经有了强如 nginx ,openresty ,apisix ,为啥还有公司孜孜不倦 go ,rust 自研网关,我理解网关作为基建没必要做那么重吧
    wu67
        10
    wu67  
    OP
       2024-01-31 14:48:48 +08:00
    knightdf
        11
    knightdf  
       2024-01-31 15:59:00 +08:00
    @wu67 额。。。楼上回复的 openresty 就是用的这个模块,同一个作者
    wu67
        12
    wu67  
    OP
       2024-01-31 16:01:00 +08:00
    @knightdf 反正我也没装, 我就图省事, 直接 apt install nginx-full
    noogler67
        13
    noogler67  
       2024-01-31 22:25:20 +08:00
    @pipixiadexiapi 我猜测是因为 nginx+lua 性能是挺高的。但首先人难招,其次 lua 生态差,很多 package 都十年不更新了。是 runtime 特别小的语言,但不是特别完备的语言
    pipixiadexiapi
        14
    pipixiadexiapi  
       2024-02-01 15:42:19 +08:00
    @wu67 感谢好文分享。看来还是得够量才能发现问题。我觉得 nginx 强,只是因为没用到瓶颈而已
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6079 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 03:08 PVG 11:08 LAX 20:08 JFK 23:08
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86