Nginx请求限流未按预期生效的问题求助
Nginx请求限流未按预期生效的问题求助
我正在尝试给Nginx配置请求限流,但实际效果和预期不符。我分别测试了每秒2次和每秒10次的限流规则,具体测试过程和结果如下:
测试1:限流规则为每秒2次请求(rate=2r/s)
Nginx配置
limit_req_zone $binary_remote_addr zone=myzone:10m rate=2r/s; limit_req_status 429; server { listen *:80; server_name 172.23.97.94; root /var/www/html; index index.html; location / { limit_req zone=myzone; try_files $uri $uri/ =404; } }
无间隔请求测试
执行以下测试命令:
for i in {1..2}; do curl -I -s "http://172.23.97.94" | head -n 1; done
测试结果:
HTTP/1.1 200 OK HTTP/1.1 429 Too Many Requests
查看access.log可以看到两个请求是同一时间发送的,但第二个请求返回了429:
172.23.106.65 - - [08/Feb/2023:17:10:35 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.68.0" 172.23.106.65 - - [08/Feb/2023:17:10:35 +0000] "HEAD / HTTP/1.1" 429 0 "-" "curl/7.68.0"
加间隔请求测试
如果给每个请求之间加0.5秒的间隔,两个请求都返回200:
for i in {1..2}; do curl -I -s "http://172.23.97.94" | head -n 1; sleep 0.5; done
测试结果:
HTTP/1.1 200 OK HTTP/1.1 200 OK
测试2:限流规则为每秒10次请求(rate=10r/s)
Nginx配置
limit_req_zone $binary_remote_addr zone=myzone:10m rate=10r/s; limit_req_status 429; server { listen *:80; server_name 172.23.97.94; root /var/www/html; index index.html; location / { limit_req zone=myzone; try_files $uri $uri/ =404; } }
无间隔请求测试
执行以下测试命令:
for i in {1..10}; do curl -I -s "http://172.23.97.94" | head -n 1; done
测试结果:
HTTP/1.1 200 OK HTTP/1.1 429 Too Many Requests HTTP/1.1 429 Too Many Requests HTTP/1.1 429 Too Many Requests HTTP/1.1 429 Too Many Requests HTTP/1.1 429 Too Many Requests HTTP/1.1 429 Too Many Requests HTTP/1.1 429 Too Many Requests HTTP/1.1 429 Too Many Requests HTTP/1.1 429 Too Many Requests
查看access.log可以看到10个请求是同一时间发送的,但只有第一个请求返回200:
172.23.106.65 - - [08/Feb/2023:17:14:53 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.68.0" 172.23.106.65 - - [08/Feb/2023:17:14:53 +0000] "HEAD / HTTP/1.1" 429 0 "-" "curl/7.68.0" 172.23.106.65 - - [08/Feb/2023:17:14:53 +0000] "HEAD / HTTP/1.1" 429 0 "-" "curl/7.68.0" 172.23.106.65 - - [08/Feb/2023:17:14:53 +0000] "HEAD / HTTP/1.1" 429 0 "-" "curl/7.68.0" 172.23.106.65 - - [08/Feb/2023:17:14:53 +0000] "HEAD / HTTP/1.1" 429 0 "-" "curl/7.68.0" 172.23.106.65 - - [08/Feb/2023:17:14:53 +0000] "HEAD / HTTP/1.1" 429 0 "-" "curl/7.68.0" 172.23.106.65 - - [08/Feb/2023:17:14:53 +0000] "HEAD / HTTP/1.1" 429 0 "-" "curl/7.68.0" 172.23.106.65 - - [08/Feb/2023:17:14:53 +0000] "HEAD / HTTP/1.1" 429 0 "-" "curl/7.68.0" 172.23.106.65 - - [08/Feb/2023:17:14:53 +0000] "HEAD / HTTP/1.1" 429 0 "-" "curl/7.68.0" 172.23.106.65 - - [08/Feb/2023:17:14:53 +0000] "HEAD / HTTP/1.1" 429 0 "-" "curl/7.68.0"
加间隔请求测试
如果给每个请求之间加0.01秒的间隔,部分请求返回200,其余返回429:
for i in {1..10}; do curl -I -s "http://172.23.97.94/device/1" | head -n 1; sleep 0.01; done
测试结果:
HTTP/1.1 200 OK HTTP/1.1 429 Too Many Requests HTTP/1.1 429 Too Many Requests HTTP/1.1 429 Too Many Requests HTTP/1.1 429 Too Many Requests HTTP/1.1 200 OK HTTP/1.1 429 Too Many Requests HTTP/1.1 429 Too Many Requests HTTP/1.1 429 Too Many Requests HTTP/1.1 200 OK
我是不是哪里配置出错了?还是Nginx的限流功能本身就不是我理解的这样工作的?
备注:内容来源于stack exchange,提问作者catalin
相关产品推荐
相关产品推荐

