nginx:http请求限制模块中的节点延迟是什么?

nginx:http请求限制模块中的节点延迟是什么?,nginx,Nginx,我正在学习nginx httprequestlimitmodule。我在httprequestmodule中没有得到nodelay的概念。我已经尝试了以下两种配置,分别使用nodelay和不使用nodelay。在有节点延迟和没有节点延迟的两种情况下,我在1秒内发出10个请求,并在6个请求和4个请求成功的情况下收到503个临时服务不可用错误。我的问题是,如果使用nodelay和不使用nodelay的结果相同,那么nodelay选项在这里的用途是什么 limit_req_zone $binary_r

我正在学习nginx httprequestlimitmodule。我在httprequestmodule中没有得到nodelay的概念。我已经尝试了以下两种配置,分别使用nodelay和不使用nodelay。在有节点延迟和没有节点延迟的两种情况下,我在1秒内发出10个请求,并在6个请求和4个请求成功的情况下收到503个临时服务不可用错误。我的问题是,如果使用nodelay和不使用nodelay的结果相同,那么nodelay选项在这里的用途是什么

limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s;
limit_req zone=one burst=2 nodelay;


让我们以这个配置为例:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    listen 127.0.0.1:81;

    location / {
        limit_req zone=one burst=5;
        echo 'OK';
    }

    location /nodelay {
        limit_req zone=one burst=5 nodelay;
        echo 'OK';
    }
}
并用nodelay测试它

$ siege -q -b -r 1 -c 10 http://127.0.0.1:81/nodelay
      done.

Transactions:                  6 hits
Availability:              60.00 %
Elapsed time:               0.01 secs
Data transferred:           0.00 MB
Response time:              0.00 secs
Transaction rate:         600.00 trans/sec
Throughput:             0.09 MB/sec
Concurrency:                0.00
Successful transactions:           6
Failed transactions:               4
Longest transaction:            0.00
Shortest transaction:           0.00
没有诺德利

$ siege -q -b -r 1 -c 10 http://127.0.0.1:81/
      done.

Transactions:                  6 hits
Availability:              60.00 %
Elapsed time:               5.00 secs
Data transferred:           0.00 MB
Response time:              2.50 secs
Transaction rate:           1.20 trans/sec
Throughput:             0.00 MB/sec
Concurrency:                3.00
Successful transactions:           6
Failed transactions:               4
Longest transaction:            5.00
Shortest transaction:           0.00
他们都通过了6个请求,使用
nodelay
nginx立即处理所有突发请求,如果没有此选项,nginx会发出过多的请求等待,因此总体速率不会超过每秒1个请求,最后一个成功请求需要5秒才能完成

编辑:
rate=6r/s
实际上是指六分之一秒内的一个请求。因此,如果您同时发送6个请求,您将通过503获得5个请求


有一个很好的答案是“桶”解释

TL;DR:如果您希望在不限制请求之间允许的间隔的情况下施加速率限制,则节点延迟选项非常有用。

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毫秒转发一个排队请求,并将503返回到 仅当传入请求使排队的用户数 请求超过20次

如果添加节点延迟:

location /login/ {
  limit_req zone=mylimit burst=20 nodelay;
  ...
}
使用nodelay参数,NGINX仍然在队列中分配插槽 根据突发参数并施加配置的速率 限制,但不能通过间隔队列请求的转发来限制。 相反,当请求“太快”到达时,NGINX会转发它 只要队列中有可供其使用的插槽,就立即执行。 它将该插槽标记为“已占用”,并且不会释放该插槽供其他插槽使用 请求,直到适当的时间过去(在我们的示例中,在 100毫秒)


请看最后一次成功请求的时间。你能简单地解释一下吗。在这里检查我的新答案限制\u请求\u区域$binary\u远程\u addr区域=一:10m速率=1r/s;limit_req zone=一个busts 5节点延迟,limit_req_zone$binary_remote_addr zone=一个:10m速率=6r/s;限制要求区域=一个
location /login/ {
  limit_req zone=mylimit burst=20 nodelay;
  ...
}