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 的访问频率, 好像不起作用?
1 lihongjie0209 2019-12-11 16:56:26 +08:00 你计算一下 request_body 的 hash 放到 header 中, 然后根据 header 去重就可以了 |
![]() | 2 rrfeng 2019-12-11 17:09:38 +08:00 via Android @lihongjie0209 想当然了,了解一下 Nginx 的处理阶段 |
3 lihongjie0209 2019-12-11 17:26:57 +08:00 @rrfeng #2 对哦, 先处理 header 再处理 bady, 搞反了 |
4 lihongjie0209 2019-12-11 17:27:27 +08:00 @rrfeng #2 要不前端做这个 hash ? |
![]() | 5 caryqy 2019-12-11 17:29:18 +08:00 换个方式,通过 redis 来,md5 每次请求添加到 redis 中,设置一个过期时间,下个请求先判断 redis 中是否存在, 频率通过过期时间来控制 |
![]() | 6 cydleadingx 2019-12-11 21:46:30 +08:00 via iPhone openresty 处理下 |
7 aoscici2000 OP @cydleadingx 为了一个辅助性功能的话, 学习成本太大了 |
![]() | 8 cydleadingx 2019-12-12 08:16:56 +08:00 via iPhone @aoscici2000 一天而已 |
9 aoscici2000 OP @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; } |