You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

NGINX burst与nodelay配置正确性验证:单IP每秒3次API请求限制需求

NGINX burst与nodelay配置正确性验证:单IP每秒3次API请求限制需求

嘿,你的整体思路没问题,但有个关键细节没踩对,调整后就能完美匹配你的“严格每秒3次请求、超量直接拒”的需求啦!

先给你拆解下当前配置的对错:

  • 正确的部分

    • $http_cf_connecting_ip作为限流标识非常准确,因为Cloudflare会把真实客户端IP放在这个请求头里,能保证你是按用户真实IP而非Cloudflare节点IP限流
    • zone=ip_limit:10m分配了10MB内存存储IP的限流状态,这个容量足够应对大部分中小规模的API场景
    • rate=3r/s精准设定了每秒3次的请求上限,符合你的核心需求
  • 需要调整的部分
    你当前location里的limit_req zone=ip_limit burst=3 nodelay;是不符合需求的——burst=3配合nodelay意味着允许短时间内额外放行3个请求(相当于瞬间最多过6个),只是这些额外请求会占用后续1秒的配额(比如瞬间发6个,接下来1秒所有请求都会被拒)。这和你“第四个请求直接拒绝、绝不放行”的要求不符。

正确的配置写法
直接去掉burstnodelay参数(或者显式写burst=0,效果一样),让NGINX严格按速率限流:

location / {
    limit_req zone=ip_limit;
    # ... 你的其他API配置
}

另外,你配置里的limit_conn_status 429;其实是多余的——这个指令是给limit_conn(限制并发连接数)用的,而你现在用的是limit_req(限制请求速率),留着反而容易混淆,建议删掉。

最后给你贴个调整后的完整参考配置:

http {
    limit_req_zone $http_cf_connecting_ip zone=ip_limit:10m rate=3r/s;
    limit_req_status 429;

    server {
        listen 80;
        server_name seu_example.com;

        location / {
            limit_req zone=ip_limit;
            # ... 你的其他配置(比如反向代理到API后端等)
        }
    }
    # ... 其他http段配置
}

这样配置后,只要某个IP每秒请求数超过3次,多余的请求会被立即返回429,完全不会排队或额外放行,完美匹配你的需求~

备注:内容来源于stack exchange,提问作者Tom

火山引擎 最新活动