![Nginx limit_req_zone 忽略速率值](https://linux22.com/image/676378/Nginx%20limit_req_zone%20%E5%BF%BD%E7%95%A5%E9%80%9F%E7%8E%87%E5%80%BC.png)
我有一个奇怪的行为,我的配置看起来像这样:
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/