我正在学习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 ;
答案 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个请求。
答案 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毫秒)。