插件窝 干货文章 Nginx对网段内ip的连接数限流如何配置

Nginx对网段内ip的连接数限流如何配置

网段 limit conn 配置 286    来源:    2025-04-27

Nginx对网段内IP的连接数限流配置

要在Nginx中对特定网段内的IP进行连接数限流,可以使用limit_conn_zonelimit_conn指令结合geo模块来实现。以下是详细配置方法:

方法一:使用geo模块识别网段

http {
    # 定义限流区域(10.0.0.0/24网段)
    geo $limited_network {
        default         0;
        10.0.0.0/24    1;
    }

    # 为限流网段创建共享内存区
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;

    server {
        listen 80;

        location / {
            # 对10.0.0.0/24网段的IP应用限流
            if ($limited_network) {
                limit_conn conn_limit_per_ip 10;  # 每个IP最多10个连接
                limit_rate 500k;                 # 限速500KB/s
            }

            # 其他配置...
        }
    }
}

方法二:使用map模块识别网段

http {
    # 使用map识别网段
    map $remote_addr $is_limited {
        default         0;
        "~^10\.0\.0\."  1;  # 10.0.0.0/24网段
    }

    # 创建共享内存区
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;

    server {
        listen 80;

        location / {
            # 对匹配的IP应用限流
            if ($is_limited) {
                limit_conn conn_limit_per_ip 5;  # 每个IP最多5个连接
                limit_rate 1m;                   # 限速1MB/s
            }

            # 其他配置...
        }
    }
}

方法三:对不同网段设置不同限制

http {
    # 定义不同网段的限制级别
    geo $conn_limit {
        default         5;   # 默认每个IP5个连接
        10.0.1.0/24    10;  # 10.0.1.0/24网段每个IP10个连接
        192.168.1.0/24 20;  # 192.168.1.0/24网段每个IP20个连接
    }

    limit_conn_zone $binary_remote_addr zone=dynamic_conn_limit:10m;

    server {
        listen 80;

        location / {
            set $limit $conn_limit;
            limit_conn dynamic_conn_limit $limit;

            # 其他配置...
        }
    }
}

注意事项

  1. limit_conn_zone需要在http上下文中定义
  2. 共享内存区大小(如10m)需要根据预期连接数调整
  3. 对于IPv6地址,可能需要额外处理
  4. 在生产环境应用前,建议先在测试环境验证
  5. 可以使用limit_conn_status自定义返回状态码(默认503)
  6. 可以使用limit_conn_log_level设置日志级别

验证配置

应用配置后,可以使用以下命令测试:

nginx -t  # 测试配置语法
nginx -s reload  # 重载配置

然后可以使用ab、wrk等工具模拟多连接测试限流效果。