插件窝 干货文章 nginx怎么配置限制同一个ip的访问频率

nginx怎么配置限制同一个ip的访问频率

limit 限制 zone 配置 50    来源:    2025-04-26

Nginx 配置限制同一个IP的访问频率

在 Nginx 中限制同一 IP 的访问频率可以有效防止恶意请求或 DDoS 攻击。以下是几种配置方法:

1. 使用 limit_req 模块限制请求速率

这是最常用的方法,基于漏桶算法实现:

http {
    # 定义限流区域,名为one,速率限制为每秒10个请求,突发不超过20个
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

    server {
        location / {
            # 应用限流规则
            limit_req zone=one burst=20 nodelay;

            # 其他配置...
        }
    }
}

参数说明: - zone=one:10m:定义名为"one"的共享内存区,大小为10MB - rate=10r/s:限制每秒10个请求 - burst=20:允许突发20个请求 - nodelay:不延迟处理突发请求,直接拒绝超过限制的请求

2. 使用 limit_conn 模块限制并发连接数

http {
    # 定义连接限制区域,名为addr,大小10MB
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        location / {
            # 限制每个IP同时只能有10个连接
            limit_conn addr 10;

            # 其他配置...
        }
    }
}

3. 结合使用限制请求速率和连接数

http {
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

    server {
        location /api/ {
            limit_req zone=req_limit burst=10 nodelay;
            limit_conn conn_limit 5;

            # 其他配置...
        }
    }
}

4. 针对特定URL进行限流

http {
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=2r/s;

    server {
        location = /login {
            limit_req zone=api_limit burst=5;

            # 其他配置...
        }
    }
}

5. 白名单设置(不限制特定IP)

http {
    geo $limit {
        default 1;
        192.168.1.0/24 0;  # 内网IP不限流
        10.0.0.1 0;        # 特定IP不限流
    }

    map $limit $limit_key {
        0 "";
        1 $binary_remote_addr;
    }

    limit_req_zone $limit_key zone=req_limit:10m rate=5r/s;

    server {
        location / {
            limit_req zone=req_limit burst=10 nodelay;

            # 其他配置...
        }
    }
}

注意事项

  1. 共享内存大小(如10m)应根据预期流量调整,每个IP约占用64字节
  2. 速率限制应根据业务需求合理设置,过严可能影响正常用户
  3. 生产环境建议先设置较宽松的限制,然后根据监控逐步调整
  4. 对于API服务,可以在HTTP状态码429(Too Many Requests)时返回友好提示

测试配置

配置完成后,使用以下命令测试并重载Nginx:

sudo nginx -t  # 测试配置是否正确
sudo nginx -s reload  # 重载配置

可以使用工具如ab(Apache Benchmark)或wrk进行压力测试验证限流效果。