使用 nginxHttpLimitReq模块请求可以通过 IP 进行限制。但是,我不明白“nodelay”选项的作用。
如果限制突发延迟内的超额请求不是必要的,则应该使用nodelay
limit_req zone=one burst=5 nodelay;
答案1
文档这里有一个听起来像你想知道的解释:
该指令指定区域(zone)和最大可能的请求突发(burst)。如果速率超过区域中概述的需求,则请求将被延迟,以便以给定的速度处理查询
据我了解,突发请求将被延迟(花费更多时间并等待直到可以处理),如果使用nodelay
选项则不使用延迟,并且超额请求将被拒绝并出现 503 错误。
这篇博文(档案馆) 很好地解释了 nginx 上的速率限制是如何工作的:
如果你和我一样,你可能想知道爆发到底是什么意思。这里有个窍门:将“爆发”一词替换为“桶”,并假设每个用户都有一个包含 5 个令牌的桶。每当他们超过每秒 1 个请求的速率时,他们就必须支付一个令牌。一旦他们用完了所有的令牌,他们就会收到 HTTP 503 错误消息,这基本上已经成为“退后,伙计!”的标准。
答案2
总结:如果您想施加速率限制而不限制请求之间的允许间隔,则 nodelay 选项很有用。
我很难消化其他答案,然后我发现了 Nginx 的新文档,其中的示例回答了这个问题:https://www.nginx.com/blog/rate-limiting-nginx/
以下是相关部分。已知:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
location /login/ {
limit_req zone=mylimit burst=20;
...
}
burst 参数定义客户端可以发出多少个超出区域指定速率的请求(对于我们的示例 mylimit 区域,速率限制为每秒 10 个请求,或每 100 毫秒 1 个请求)。在前一个请求之后 100 毫秒内到达的请求将被放入队列中,这里我们将队列大小设置为 20。
这意味着,如果同时有 21 个请求从给定 IP 地址到达,NGINX 会立即将第一个请求转发到上游服务器组,并将剩余的 20 个请求放入队列中。然后,它每 100 毫秒转发一个排队请求,并且只有当传入请求使排队请求数超过 20 时,才会向客户端返回 503。
如果添加nodelay:
location /login/ {
limit_req zone=mylimit burst=20 nodelay;
...
}
使用 nodelay 参数,NGINX 仍会根据 burst 参数在队列中分配插槽并施加配置的速率限制,但不会通过间隔转发排队请求来做到这一点。相反,当请求“太早”到达时,只要队列中有可用的插槽,NGINX 就会立即转发它。它会将该插槽标记为“已占用”,并且不会释放它以供其他请求使用,直到经过适当的时间(在我们的示例中,100 毫秒后)。
答案3
我的看法如下:
请求将以最快的速度得到处理,直到超出区域速率。区域速率是“平均”的,因此如果您的速率是
1r/s
突发的,10
您可以在 10 秒内收到 10 个请求。超出区域速率后:
a. 如果没有
nodelay
,则至 的进一步请求burst
将被延迟。b. 有了
nodelay
,以后的请求burst
将尽快得到处理。超过后
burst
,服务器将返回错误响应,直到突发窗口过期。例如对于速率1r/s
和突发10
,客户端将需要等待最多 10 秒才能接受下一个请求。
答案4
我第一次读到https://www.nginx.com/blog/rate-limiting-nginx/。
现在我确信我明白了,而且我的答案是迄今为止最好的。:)
假设:10r/s
设置了,服务器的最大容量为,例如10000r/s
, 10r/ms
并且此刻只有 1 个客户端。
这就是10r/s per IP burst=40 nodelay
和之间的主要区别10r/s per IP burst=40
。
作为https://www.nginx.com/blog/rate-limiting-nginx/记录(我强烈建议先阅读这篇文章(除了两阶段速率限制部分),此行为修复了一个问题。哪一个?:
在我们的示例中,队列中的第 20 个数据包等待 2 秒才被转发,此时对它的响应可能对客户端不再有用。
查看我做的草稿,一个40th
请求在 得到响应,1s
而另一个请求40th
在 得到响应4s
。
这可以充分利用服务器的功能:尽快发回响应,同时仍然保持对x r/s
给定客户端/IP 的约束。
但这里也有成本。成本将是:
如果服务器上有许多客户端排队,假设客户端A
,B
和C
。
如果没有nodelay
,请求的服务顺序类似于ABCABCABC
。
有了nodelay
,顺序更可能是AAABBBCCC
。
我想总结一下这篇文章https://www.nginx.com/blog/rate-limiting-nginx/这里。
首先,最重要的配置是x r/s
。
x r/s
只是,多余的请求会被立即拒绝。x r/s
+burst
,多余的请求将排队。
1.
相比之下2.
,代价是在客户端,排队的请求占用了以后的请求获得服务的机会。
例如10r/s burst=20
vs 10r/s
,11th
在后一种情况下,请求应该立即被拒绝,但现在它已排队并被服务。该11th
请求占用了21th
请求的机会。
x r/s
++burst
,nodelay
已经解释过了。
附言两阶段速率限制文章的这一部分非常令人困惑。我不明白,但这似乎并不重要。
例如:
使用此配置,以 8 r/s 的速度发出连续请求流的客户端将遇到以下行为。
8 r/s?真的吗?图中显示 3 秒内有 17 个请求,17 / 3 = 8?