插件窝 干货文章 如何使用Nginx进行请求限速和流量控制

如何使用Nginx进行请求限速和流量控制

limit zone 限速 限制 990    来源:    2025-04-13

使用Nginx进行请求限速和流量控制

Nginx提供了多种模块来实现请求限速和流量控制,可以有效防止服务器被过多请求压垮或带宽被耗尽。以下是主要的实现方法:

1. 限制请求速率(limit_req模块)

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

    server {
        location /api/ {
            limit_req zone=one burst=20 nodelay;
            proxy_pass http://backend;
        }
    }
}
  • limit_req_zone 定义共享内存区域和速率限制

    • $binary_remote_addr 使用客户端IP作为限制键
    • zone=one:10m 创建名为"one"的10MB共享内存区
    • rate=10r/s 限制每秒10个请求
  • limit_req 应用限制规则

    • burst=20 允许突发20个请求
    • nodelay 立即处理突发请求而不延迟

2. 限制连接数(limit_conn模块)

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        location /download/ {
            limit_conn addr 5;
            limit_rate 100k;
        }
    }
}
  • limit_conn_zone 定义共享内存区域
  • limit_conn addr 5 限制每个IP最多5个并发连接
  • limit_rate 100k 限制每个连接的下载速度为100KB/s

3. 带宽限制(limit_rate)

location /download/ {
    limit_rate 500k;  # 限制每个连接500KB/s
    limit_rate_after 10m;  # 前10MB不限速
}

4. 基于地理位置的限制(geo模块)

geo $limited {
    default         0;
    192.168.1.0/24  1;
    10.0.0.0/8      1;
}

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

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

5. 高级限速配置

http {
    # 定义不同区域的限速规则
    limit_req_zone $binary_remote_addr zone=api_slow:10m rate=2r/s;
    limit_req_zone $binary_remote_addr zone=api_fast:10m rate=20r/s;
    limit_conn_zone $binary_remote_addr zone=api_conn:10m;

    server {
        location /api/v1/slow {
            limit_req zone=api_slow burst=10;
            limit_conn api_conn 2;
            proxy_pass http://backend;
        }

        location /api/v1/fast {
            limit_req zone=api_fast burst=50;
            limit_conn api_conn 10;
            proxy_pass http://backend;
        }
    }
}

6. 白名单设置

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;

最佳实践

  1. 分层限速:结合全局限制和特定路径限制
  2. 合理设置burst:允许合理突发但不耗尽资源
  3. 监控和调整:定期检查日志和调整限速参数
  4. 错误处理:配置适当的429和503错误页面
  5. 测试:使用工具如ab、wrk或jmeter测试限速效果

错误页面配置

error_page 429 /too_many_requests;
error_page 503 /service_unavailable;

location = /too_many_requests {
    internal;
    return 429 '{"error": "Too many requests"}';
}

location = /service_unavailable {
    internal;
    return 503 '{"error": "Service temporarily unavailable"}';
}

通过合理配置这些限速和流量控制功能,可以有效保护您的服务器资源,防止恶意攻击或突发流量导致的服务不可用。