插件窝 干货文章 如何实现Nginx的限制请求速率配置

如何实现Nginx的限制请求速率配置

limit 限制 zone 请求 840    来源:    2025-04-10

Nginx限制请求速率配置指南

Nginx提供了多种方式来限制客户端请求速率,防止服务器被过多请求压垮。以下是几种常用的配置方法:

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

limit_req_zonelimit_req指令可以限制单个IP的请求速率。

基本配置

http {
    # 定义限制区域,名为one,10MB大小,限制每秒5个请求
    limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;

    server {
        location / {
            # 应用限制区域one
            limit_req zone=one;

            # 其他配置...
        }
    }
}

高级配置选项

location /api/ {
    # 应用限制区域one,允许突发10个请求,无延迟处理
    limit_req zone=one burst=10 nodelay;

    # 其他配置...
}
  • burst:允许的突发请求数
  • nodelay:不延迟处理突发请求,立即处理但限制后续请求

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

限制单个IP的同时连接数:

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

    server {
        location /download/ {
            # 每个IP最多5个连接
            limit_conn addr 5;

            # 其他配置...
        }
    }
}

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

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

    server {
        location /api/ {
            limit_req zone=api_limit burst=20 nodelay;
            limit_conn api_conn 10;

            # 其他配置...
        }
    }
}

4. 基于地理位置的限制

geo $limit {
    default         1;
    10.0.0.0/8     0;
    192.168.0.0/24 0;
}

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

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

5. 白名单设置

geo $limited {
    default         1;
    192.168.1.0/24 0;
    10.1.0.0/16    0;
}

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

limit_req_zone $limit zone=req_zone:10m rate=5r/s;

6. 自定义错误响应

http {
    limit_req_status 429; # 默认是503
    limit_conn_status 429;

    server {
        error_page 429 /rate_limit.html;
        location = /rate_limit.html {
            root /usr/share/nginx/html;
            internal;
        }
    }
}

最佳实践建议

  1. 对于API端点,建议设置合理的速率限制
  2. 静态资源可以设置较高的限制或不限制
  3. 登录和注册接口应该设置更严格的限制
  4. 监控被限制的请求数量,调整限制参数
  5. 考虑使用CDN或WAF作为第一层防护

测试与验证

配置完成后,可以使用以下工具测试限制是否生效: - ab (Apache Benchmark) - wrk - siege - jmeter

例如:

ab -n 100 -c 10 http://yourserver.com/api/

通过以上配置,您可以有效地保护Nginx服务器免受过多请求的影响,确保服务的稳定性。