在 Nginx 配置中,当您想要使用limit_req_zone
/来限制请求处理速率时limit_req instructions
,我不太明白该nodelay
选项的用途。
根据我的理解,它会终止超过定义速率的请求而不会延迟它们。所以它似乎等同于burst=0
。这就是为什么我不理解以下示例的原因:
limit_req zone=one burst=5 nodelay;
burst
定义了可以延迟的请求数,那么burst
如果有nodelay
选项,定义有什么意义呢?
答案1
我发现limit_req
文档足够清晰。
burst
记录方式如下:
过多的请求将被延迟,直到其数量超过最大突发大小 [...]
nodelay
记录方式如下:
如果不希望在限制请求的同时延迟过多的请求,则应使用参数nodelay
请求数量会受到限制,以符合定义的速率。如果请求以更高的速率传入,则不会超过定义的每单位时间的请求数将被处理。然后您需要决定如何处理其他请求。
- 默认情况下(no
burst
,nonodelay
),请求会被拒绝并出现 HTTP 503 错误。 - 使用
burst
,您可以将定义数量的请求堆叠在等待队列中,但你的处理速度不会比定义的更快每单位时间的请求数速度。 - 有了
burst
和nodelay
,队列就不再等待和请求突发将得到立即处理。
答案2
通过指定burst
和,nodelay
我发现这样更容易理解该机制(与通常的理解相反):
- 您允许的最大
burst
请求数。$binary_remote_addr
这是您从给定地址接受的最大请求数。每个请求都会增加一个内部计数器。当计数器达到上限时,burst
所有其他请求都将被拒绝(并且计数器不会超过burst
上限)。 - 该计数器按照指定的速率持续减少
rate
。
这种逻辑表明,指定一个高burst
值(例如 100 及以上)和一个低值rate
(甚至像 2r/s 这样的值)非常有意义。这可以更好地处理正常浏览(一批并行请求,然后是一段安静期),同时防止持续的机器人请求流。
答案3
原答案的评论好像是错误的。
当前的问题是,rate=6r/s burst=0 和 rate=1r/s burst=5 nodelay 之间有什么区别
这些答案很好地解释了当不存在 nodelay 选项时的区别——在这种情况下,请求会与突发一起排队,而在没有突发的情况下则会被 503 处理。
最初的答案似乎很正确——使用 nodelay,突发请求会立即得到处理。因此,唯一的暗示是,指定突发 + nodelay 与首先指定 busrt=0 的更高限制之间没有区别。
因此,为了更简洁地回答 OP 的问题:指定 nodelay 时突发的含义与仅指定没有突发的更大速率相同。