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