Nginx limit_req_zone 忽略速率值

Nginx limit_req_zone 忽略速率值

我有一个奇怪的行为,我的配置看起来像这样:

http {
    limit_req_zone $binary_remote_addr zone=nocachelimit:10m rate=120r/m;
}
...
location "/api" {
    {
        limit_req zone=nocachelimit burst=20;
    }
}

无论我把什么值输入到利率中,我甚至尝试过1000转/秒 我不断收到“普通”用户的日志条目,其中显示:

 [warn] 16526#0: *4661 delaying request, excess: 1.000, by zone "nocachelimit"

典型的用例是未落入区域的页面加载 + 4-5 个应限制在区域内的 Ajax 请求。

这种行为可能是什么原因造成的?

答案1

速率决定了请求的处理速度。如果将速率设置为 120r/m,则意味着每 0.5 秒将处理 1 个请求。

如果您一次收到 5 个请求,这并不意味着它们都会通过。它们将排队(最高可达您的突发大小),并按顺序处理,每 0.5 秒处理 1 个。

您之所以收到警告,是因为事情正在排队,并且被延迟了。这并不意味着他们被拒绝了。

如果您不希望事情延迟,请使用 nodelay 参数:

location "/api" {
  limit_req zone=nocachelimit burst=20 nodelay;
}

有关其工作原理的详细信息,请参阅https://www.nginx.com/blog/rate-limiting-nginx/

相关内容