nginx:http请求限制模块中的nodelay是什么?

时间:2016-04-15 06:57:15

标签: nginx

我正在学习nginx httprequestlimitmodule。我没有在httprequestmodule中获得nodelay的概念。我尝试过使用nodelay和没有nodelay的两个配置。在使用nodelay和没有nodelay的两种情况下,我在1秒内命中10个请求,并且6个请求获得503临时服务不可用错误,4个请求成功。我的问题是,如果结果与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=2r/s;
limit_req zone=one burst=2 ;

2 个答案:

答案 0 :(得分:1)

让我们来看看这个配置:

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

且没有nodelay

$ 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实际上是指1/6秒内的一个请求。因此,如果您同时发送6个请求,您将获得其中5个请求。

“桶”解释https://serverfault.com/a/247302/211028

有一个很好的答案

答案 1 :(得分:0)

TL; DR:如果要强制设置速率限制而不限制请求之间允许的间距,则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个请求   毫秒)。请求到达时间超过100毫秒   在上一个被放入队列之后,我们在这里设置   队列大小为20。

     

这意味着如果21个请求来自给定的IP地址   同时,NGINX将第一个转发到上游服务器   立即分组并将剩余的20个放入队列中。然后呢   每100毫秒转发一个排队的请求,并返回503   仅当传入请求生成排队的数量时,客户端   请求超过20。

如果添加nodelay:

location /login/ {
  limit_req zone=mylimit burst=20 nodelay;
  ...
}
  

使用nodelay参数,NGINX仍然在队列中分配插槽   根据突发参数并强加配置的速率   限制,但不是通过间隔排队请求的转发。   相反,当请求“太快”到来时,NGINX会转发它   只要队列中有可用的插槽,就会立即生效。   它将插槽标记为“已采用”,并且不会将其释放以供另一个使用   请求,直到适当的时间过去(在我们的例子中,之后   100毫秒)。