You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 14:14:08