RT. 在服务器上建了 webdav 服务, 然后本地用 infuse 播放视频.
但是这播放器的缓存策略好像有点问题, 会一直不停的全速缓存整个视频,
我知道可以limit_rate ***k
对 location 限速, 但是这是所有请求都限速了(有时候会想直接把文件全速下载回本地保存)
就想问问有没有办法能针对特定 ua 进行 limit_rate ?
1
nashaofu 291 天前 via Android
两个功能都有的吧,组合下就可以用,if $http_user_agent ~* "ua" {}
|
3
jinzc 291 天前
换用 openresty , 编码识别 ua 后限制速率
|
4
dropdatabase 291 天前 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 } # 其他处理逻辑... } ``` |
5
kaf 291 天前
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; # 其他配置项 ... } } } |
6
knightdf 291 天前
用 ngx-lua module ,想怎么限制都行
|
7
wu67 OP @kaf
@dropdatabase 懂了, 感谢. 比较迷惑的是, 如果定义在了 location / 下面, 那么这个 server 下所有的 location 路径都会被限速, 而不是只限制根路径. 我甚至还尝试过开另一个端口启动不限速的服务, 现在改用 map 了. ``` map $http_user_agent $agent_limit_rate { default 0; "" 2048k; ~*infuse 2048k; } server { ... limit_rate $agent_limit_rate; ... } ``` |
8
wu67 OP |
9
pipixiadexiapi 291 天前
@wu67 粗浅见解,openresty 是 nginx+lua ,重在 lua 做了许多有用的模块
另外想问问各位大佬,歪个楼,既然已经有了强如 nginx ,openresty ,apisix ,为啥还有公司孜孜不倦 go ,rust 自研网关,我理解网关作为基建没必要做那么重吧 |
10
wu67 OP |
13
noogler67 291 天前
@pipixiadexiapi 我猜测是因为 nginx+lua 性能是挺高的。但首先人难招,其次 lua 生态差,很多 package 都十年不更新了。是 runtime 特别小的语言,但不是特别完备的语言
|
14
pipixiadexiapi 290 天前
@wu67 感谢好文分享。看来还是得够量才能发现问题。我觉得 nginx 强,只是因为没用到瓶颈而已😄
|