Skip to content

限流配置

限流可以防止恶意请求和DDoS攻击,保护服务器资源。

基本配置

定义限流区域

nginx
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

应用限流

nginx
location / {
    limit_req zone=one burst=5 nodelay;
}

完整配置

生产环境配置

nginx
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;

server {
    listen 80;
    server_name api.example.com;

    # API限流
    location /api/ {
        limit_req zone=api_limit burst=20 nodelay;

        proxy_pass http://backend;
    }

    # 登录限流
    location /login/ {
        limit_req zone=login_limit burst=5 nodelay;

        proxy_pass http://backend;
    }
}

限流参数

limit_req_zone参数

$binary_remote_addr

  • 客户端IP地址
  • 使用二进制格式节省内存

zone

  • 限流区域名称和大小
  • 格式:名称:大小

rate

  • 限流速率
  • 格式:数字/单位(r/s、r/m)

limit_req参数

zone

  • 使用的限流区域

burst

  • 突发请求数量
  • 允许短时间内的突发请求

nodelay

  • 不延迟处理突发请求
  • 立即处理或拒绝

不同场景的限流

API限流

nginx
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

location /api/ {
    limit_req zone=api_limit burst=20 nodelay;

    proxy_pass http://backend;
}

登录限流

nginx
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;

location /login/ {
    limit_req zone=login_limit burst=5 nodelay;

    proxy_pass http://backend;
}

下载限流

nginx
limit_conn_zone $binary_remote_addr zone=addr:10m;

location /download/ {
    limit_conn addr 1;
    limit_rate 1m;

    proxy_pass http://backend;
}

基于URL的限流

nginx
limit_req_zone $request_uri zone=url_limit:10m rate=1r/s;

location / {
    limit_req zone=url_limit burst=5 nodelay;

    proxy_pass http://backend;
}

自定义限流响应

自定义错误页面

nginx
limit_req_status 429;

error_page 429 /429.html;

location = /429.html {
    root /usr/share/nginx/html;
}

返回JSON

nginx
limit_req_status 429;

error_page 429 = @rate_limit;

location @rate_limit {
    default_type application/json;
    return 429 '{"error": "Rate limit exceeded"}';
}

完整示例

生产环境配置

nginx
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

server {
    listen 80;
    server_name api.example.com;

    # API限流
    location /api/ {
        limit_req zone=api_limit burst=20 nodelay;

        proxy_pass http://backend;
    }

    # 登录限流
    location /login/ {
        limit_req zone=login_limit burst=5 nodelay;

        proxy_pass http://backend;
    }

    # 下载限流
    location /download/ {
        limit_conn conn_limit 1;
        limit_rate 1m;

        proxy_pass http://backend;
    }

    # 自定义限流响应
    limit_req_status 429;

    error_page 429 = @rate_limit;

    location @rate_limit {
        default_type application/json;
        return 429 '{"error": "Rate limit exceeded"}';
    }
}

监控限流

记录限流日志

nginx
log_format limit '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$request_time"';

access_log /var/log/nginx/limit.log limit;

常见问题

限流过于严格

原因: rate设置过低

解决: 提高限流速率

nginx
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=20r/s;

限流不生效

原因: limit_req未正确配置

解决: 检查limit_req配置

nginx
limit_req zone=api_limit burst=20 nodelay;

总结

限流配置的关键点:

  • limit_req_zone:定义限流区域
  • limit_req:应用限流
  • rate:设置限流速率
  • burst:设置突发请求数
  • nodelay:不延迟处理突发请求
  • 自定义响应:自定义限流响应

合理配置限流,防止恶意请求和DDoS攻击。