Nginx-如果有`nodelay`选项,定义`burst`是什么意思


14

在Nginx配置中,当您想通过使用limit_req_zone/ 来限制请求处理速率时limit_req instructions,我不太了解该nodelay选项的用法。
以我的理解,它会在不延迟定义速率的情况下终止请求。因此,它似乎等同于burst=0。这就是为什么我不理解以下示例的原因:

limit_req zone=one burst=5 nodelay;

burst定义了可能会延迟的请求数,那么定义burst是否有nodelay选项的含义是什么?

Answers:


28

我发现limit_req文档足够清晰。

burst 是这样记录的:

过多的请求被延迟,直到它们的数量超过最大突发大小[...]

nodelay 是这样记录的:

如果不需要在限制请求时延迟过多的请求,则应使用参数nodelay

请求被限制为适合定义的速率。如果请求以更高的速率传入,则将不超过每个时间单位定义的请求数。然后,您需要决定如何处理其他请求。

  • 默认情况下(no burst,no nodelay),请求被拒绝,并显示HTTP 503错误。
  • 使用burst,您可以将已定义的请求数堆叠在等待队列中,但是处理它们的速度不会比按时间单位速率定义的请求要
  • 使用burstnodelay,队列将不会等待,请求突发将立即得到处理

3
感谢您的澄清,文档对我来说还不够清楚。
Nicolas

1
我编辑了我的答案,以引用它来反映文档。每个词在nginx文档中都经过仔细加权,以使其简洁:这就是它的优点。
伯纳德·罗塞特

3
那么,limit_req_zone $binary_remote_addr zone=flood:10m rate=6r/s; limit_req zone=flood burst=0;每秒允许6个请求和每秒允许6个请求之间有什么区别limit_req_zone $binary_remote_addr zone=flood:10m rate=1r/s; limit_req zone=flood burst=5 nodelay;
Nicolas 2014年

2
只是想确认一下伯纳德的答案。如果Bernard所说的是正确的,那么使用Burst和Nodelay,Web服务器的R / S命中率将不时超过定义的请求,对吗?
Jcyrss

2
@BernardRosset您能否说明“队列不会等待”-您的意思是什么?
丹尼斯·戈尔巴乔夫

8

关于原始答案的评论似乎是错误的。

当前的问题是,说速率= 6r / s突发= 0和速率= 1r / s突发= 5节点之间有什么区别?

答案很好地解释了不存在nodelay选项时的区别-在这种情况下,请求随着突发而排队,并且在没有突发的情况下进行503排队。

最初的答案似乎就在现场-使用nodelay,立即处理突发请求。因此,这唯一的含义是,指定突发+节点布局与仅指定busrt = 0的较高限制之间没有区别。

因此,为了更简洁地回答OP问题:指定了nodelay时,burst的含义与仅指定较大速率而不采用burst的含义相同。


感谢您澄清了这一点,这实际上是我提出问题的原因。
尼古拉斯

错了 再次阅读我的答案和评论。如果您仍然看不到它,请让我们做一下草图:Nicolas在对我的答案的评论中提供了两种配置的6r / s。1st秒->两个场景都将服务6r,但是conf#2将在突发中存储5。从第二秒开始,对于conf#1(所有6r服务)仍然相同,但是conf#2将根据符合速率限制的消耗从突发存储桶中删除1,从而在队列中留出1r的空间。其他5r被扔掉。
伯纳德·罗塞特

@BernardRosset:但是,使用nodelay,是否表示这些请求将立即处理而不是排队?
siride

4

通过burstnodelay指定,我发现更容易理解这样的机制(与通常理解的相反):

  1. 您最多允许burst请求。随着$binary_remote_addr这就是你从一个给定的地址接受请求的最大数量。每个请求都会增加一个内部计数器。当计数器到达时,burst所有其他请求都会被拒绝(并且计数器不会增加到超出burst值的水平)。
  2. 该计数器以所指定的速率连续减小rate

此逻辑表明,指定一个较高的burst值(例如100和更大)和一个较低的rate值(甚至是2r / s之类的值)是很有意义的。这样可以更好地处理正常浏览(一批并行请求,然后是一段安静的时间),同时防止持续的机器人请求流。


1

我向在nginx网站上撰写以下帖子的人问了尼古拉斯的问题。 NGINX速率限制。他的回复如下

在以前的速率限制中,nginx将以1/6秒的间隔接受连续的请求。它不会接受不满足该最小时间间隔的突发请求。另一方面,在后一个定义中,nginx将接受最多6个请求的突发,而不管请求之间的时间间隔如何。 答案链接


您好@Gardener,欢迎提出服务器故障。感谢您的精心设计。非常感谢与源的链接。
马可(Marco)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.