如何在nginx中限制用户一分钟内发出的请求数量?

  • 本文关键字:请求 一分钟 nginx 用户 nginx
  • 更新时间 :
  • 英文 :


我正在NGINX中设置API服务器,因此我在其中应用了速率限制,以便我可以抵制用户的请求,但它不能正常工作,我希望服务器应该正常工作。我想要10 req/min,在达到用户应该得到429错误的限制之后。当前的问题是,在达到限制后,我仍然可以在等待1s后访问该记录我的NGINX配置为:-

limit_req_zone $binary_remote_addr zone=XXXX:1m rate=10r/m;
location / {
limit_req zone=XXXX burst=9 nodelay;
limit_req_status 429;
proxy_pass http://XXXX:x000/api/;
}

我整个上午都在寻找答案,我的情况和你一样(但配置不同(。但是,不幸的是,速率似乎只是计算频率请求的限制。

所以10r/m只是意味着";每6秒1个请求";而不是";每分钟只允许10个请求";。

来自nginx博客:

在该示例中,速率不能超过每秒10个请求。NGINX实际上以毫秒粒度跟踪请求,因此此限制对应于每100毫秒(ms(1个请求。因为我们不允许突发(见下一节(,这意味着如果请求在前一个允许的请求后不到100ms到达,则会被拒绝。

同样来自FreeCodeCamp帖子:

对于NGINX,300r/m和5r/s的处理方式相同:允许该区域每0.2秒一个请求

根据您的配置,您有9个请求和nodelay的突发,这意味着您可以在前6秒内接受10个请求,然后突发将每6秒释放1个请求。所以我想说,你应该能够提出大约19个成功的请求,在你的情况下,所有其他请求都将以429个被拒绝。

再次从nginx博客文章:

当请求"太快"到达时,只要队列中有可用的插槽,NGINX就会立即转发它。它将该插槽标记为"已占用",并且在经过适当的时间之前(在我们的示例中,在100ms之后(,不会释放该插槽供另一个请求使用。

如果我回答了您的疑问,请告诉我:(

最新更新