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

NGINX如何配置多IP分组共享累计请求速率限制

方案结论

原生NGINX无需第三方模块即可实现多IP分组共享阈值的速率限制,核心实现逻辑是通过geo模块为不同IP/IP组映射统一的分组标识,将分组标识与请求接口拼接作为限流规则的计数键,即可实现同组IP同接口下的请求数累计计算,共享限流阈值。

完整配置示例

所有配置均在NGINX配置文件的http块、对应server/location块中编写,适配Django反向代理场景:

http {
    # 1. 定义IP与限流分组的映射关系
    geo $limit_group {
        # 单独配置的特殊单IP,分配独立分组ID
        123.123.123.123 "single_special";
        # 需要共享阈值的IP组,分配相同分组ID
        45.45.45.45 "group_shared";
        65.65.65.65 "group_shared";
        # 其余所有来源IP默认归入普通分组
        default "common";
    }

    # 2. 定义各场景限流规则:限流键用「分组ID+请求URI」拼接,同键值下的请求统一累计计数
    # 特殊单IP访问/users接口:10r/s
    limit_req_zone $limit_group$uri zone=zone_single_users:10m rate=10r/s;
    # 特殊单IP访问/products接口:15r/s
    limit_req_zone $limit_group$uri zone=zone_single_products:10m rate=15r/s;
    # 共享IP组访问/users接口:合计20r/s
    limit_req_zone $limit_group$uri zone=zone_group_users:10m rate=20r/s;
    # 共享IP组访问/products接口:合计30r/s
    limit_req_zone $limit_group$uri zone=zone_group_products:10m rate=30r/s;
    # 普通IP访问任意接口:5r/s
    limit_req_zone $limit_group$uri zone=zone_common:10m rate=5r/s;

    # 原有Django服务反向代理配置
    upstream django_backend {
        server 127.0.0.1:8000; # 替换为实际Django服务监听地址
    }

    server {
        listen 80;
        server_name your_domain.com; # 替换为实际服务域名

        # /users接口限流与代理配置
        location /users {
            # 按分组匹配对应限流规则
            if ($limit_group = "single_special") {
                limit_req zone=zone_single_users burst=5 nodelay;
            }
            if ($limit_group = "group_shared") {
                limit_req zone=zone_group_users burst=10 nodelay;
            }
            if ($limit_group = "common") {
                limit_req zone=zone_common burst=2 nodelay;
            }
            # 反向代理透传配置
            proxy_pass http://django_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        # /products接口限流与代理配置
        location /products {
            if ($limit_group = "single_special") {
                limit_req zone=zone_single_products burst=7 nodelay;
            }
            if ($limit_group = "group_shared") {
                limit_req zone=zone_group_products burst=15 nodelay;
            }
            if ($limit_group = "common") {
                limit_req zone=zone_common burst=2 nodelay;
            }
            # 反向代理透传配置
            proxy_pass http://django_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        # 其余所有接口默认限流与代理配置
        location / {
            limit_req zone=zone_common burst=2 nodelay;
            proxy_pass http://django_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}
配置说明
  • burst参数为突发请求缓冲队列长度,nodelay表示队列内请求无需排队立即处理,超出阈值+队列长度的请求会直接返回503响应,可根据业务实际容忍度调整参数值。
  • limit_req_zone中配置的10m为对应限流规则分配的共享内存空间,1M内存约可存储1.6万条请求计数状态,10M可满足绝大多数中小业务场景需求。
  • 配置修改完成后,先执行nginx -t校验语法正确性,校验通过后执行nginx -s reload重载配置即可生效。
  • 如果后续需要新增IP分组,只需要在geo $limit_group块中给对应IP分配新的统一分组ID,再补充对应限流规则即可,扩展成本极低。

内容的提问来源于stack exchange,提问作者Sidharth Samant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:21:15