Answers:
我发现limit_req
文档足够清晰。
burst
是这样记录的:
过多的请求被延迟,直到它们的数量超过最大突发大小[...]
nodelay
是这样记录的:
如果不需要在限制请求时延迟过多的请求,则应使用参数nodelay
请求被限制为适合定义的速率。如果请求以更高的速率传入,则将不超过每个时间单位定义的请求数。然后,您需要决定如何处理其他请求。
burst
,no nodelay
),请求被拒绝,并显示HTTP 503错误。burst
,您可以将已定义的请求数堆叠在等待队列中,但是处理它们的速度不会比按时间单位速率定义的请求要快。burst
和nodelay
,队列将不会等待,请求突发将立即得到处理。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;
?
关于原始答案的评论似乎是错误的。
当前的问题是,说速率= 6r / s突发= 0和速率= 1r / s突发= 5节点之间有什么区别?
答案很好地解释了不存在nodelay选项时的区别-在这种情况下,请求随着突发而排队,并且在没有突发的情况下进行503排队。
最初的答案似乎就在现场-使用nodelay,立即处理突发请求。因此,这唯一的含义是,指定突发+节点布局与仅指定busrt = 0的较高限制之间没有区别。
因此,为了更简洁地回答OP问题:指定了nodelay时,burst的含义与仅指定较大速率而不采用burst的含义相同。
nodelay
,是否表示这些请求将立即处理而不是排队?
通过burst
和nodelay
指定,我发现更容易理解这样的机制(与通常理解的相反):
burst
请求。随着$binary_remote_addr
这就是你从一个给定的地址接受请求的最大数量。每个请求都会增加一个内部计数器。当计数器到达时,burst
所有其他请求都会被拒绝(并且计数器不会增加到超出burst
值的水平)。rate
。此逻辑表明,指定一个较高的burst
值(例如100和更大)和一个较低的rate
值(甚至是2r / s之类的值)是很有意义的。这样可以更好地处理正常浏览(一批并行请求,然后是一段安静的时间),同时防止持续的机器人请求流。
基于Dan的出色回答和nginx的源代码,此nodelay
行为的简要概述如下:
burst
是允许多少个新的并发请求。rate
是每单位时间有多少新的并发请求变旧。(此更新是逐步进行的:每个请求一次,但不是每秒一次。)我建议阅读此线程: limit_req_zone受位置/代理限制
而这个答案: stackoverflow