【问题标题】:How to limit the number of user 's requests made within a minute in nginx?nginx如何限制用户在一分钟内发出的请求数?
【发布时间】:2022-02-04 23:41:42
【问题描述】:

我在 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/;
}

【问题讨论】:

    标签: nginx


    【解决方案1】:

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

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

    来自nginx blog

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

    同样来自FreeCodeCamp post

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

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

    再次来自nginx blog post

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

    如果我回答了你的疑问,请告诉我:)

    【讨论】:

      猜你喜欢
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      相关资源
      最近更新 更多