Nginx 如何限制相同 request_body 的访问频率

2019-12-11 15:26:51 +08:00
 aoscici2000
limit_req_zone $request_body zone=myzone:10m rate=2r/s;

server {
    location /push {
        limit_except POST {
            deny  all;
        }
        limit_req zone=myzone burst=2 nodelay;
        ...
    }
}

如上, 我希望能限制相同 request_body 的访问频率, 好像不起作用?

3850 次点击
所在节点    NGINX
9 条回复
lihongjie0209
2019-12-11 16:56:26 +08:00
你计算一下 request_body 的 hash 放到 header 中, 然后根据 header 去重就可以了
rrfeng
2019-12-11 17:09:38 +08:00
@lihongjie0209
想当然了,了解一下 Nginx 的处理阶段
lihongjie0209
2019-12-11 17:26:57 +08:00
@rrfeng #2 对哦, 先处理 header 再处理 bady, 搞反了
lihongjie0209
2019-12-11 17:27:27 +08:00
@rrfeng #2 要不前端做这个 hash ?
caryqy
2019-12-11 17:29:18 +08:00
换个方式,通过 redis 来,md5 每次请求添加到 redis 中,设置一个过期时间,下个请求先判断 redis 中是否存在, 频率通过过期时间来控制
cydleadingx
2019-12-11 21:46:30 +08:00
openresty 处理下
aoscici2000
2019-12-11 22:12:17 +08:00
@cydleadingx 为了一个辅助性功能的话, 学习成本太大了
cydleadingx
2019-12-12 08:16:56 +08:00
@aoscici2000 一天而已
aoscici2000
2019-12-13 18:21:26 +08:00
@lihongjie0209 我试了一下多做一层代理, 第一层把 request_body 添加到 header, 由第二层做去重, 但好像不太成功, 不知道 header 是怎么设置的? 能否指点一下 ^^

limit_req_zone $http_HEADER zone=myzone:10m rate=1r/s;

location /a {
proxy_pass http://127.0.0.1/b;
add_header data $request_body;
}

location /b {
proxy_pass http://127.0.0.1/real-addr;
limit_req zone=myzone burst=2 nodelay;
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/628021

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX