插件窝 干货文章 nginx限流怎么使用

nginx限流怎么使用

limit zone Nginx req 853    来源:    2025-04-07

Nginx限流配置指南

Nginx提供了多种限流机制来控制客户端请求速率,防止服务器过载。以下是几种常用的限流方法:

1. 基于连接数的限流(ngx_http_limit_conn_module)

http {
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;

    server {
        location / {
            limit_conn perip 10;    # 每个IP最多10个并发连接
            limit_conn perserver 100; # 整个服务器最多100个并发连接
        }
    }
}

2. 基于请求速率的限流(ngx_http_limit_req_module)

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

    server {
        location / {
            limit_req zone=one burst=5 nodelay;
            # rate=1r/s 表示每秒1个请求
            # burst=5 表示允许突发5个请求
            # nodelay 表示不延迟处理突发请求
        }
    }
}

3. 带宽限制(ngx_http_core_module)

location /download/ {
    limit_rate 50k;  # 限制下载速度为50KB/s
    limit_rate_after 500k; # 前500KB不限速
}

4. 综合示例

http {
    # 定义限流区域
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

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

        location /api/ {
            # 请求速率限制
            limit_req zone=api_limit burst=20 nodelay;

            # 并发连接限制
            limit_conn conn_limit 5;

            # 响应速率限制
            limit_rate 100k;

            proxy_pass http://backend;
        }
    }
}

5. 高级配置

白名单设置

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_limit:10m rate=5r/s;

不同URL不同限流策略

map $uri $limit_bucket {
    ~^/api/v1/login  "login";
    ~^/api/v1/search "search";
    default          "default";
}

limit_req_zone $binary_remote_addr zone=login_limit:10m rate=2r/s;
limit_req_zone $binary_remote_addr zone=search_limit:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=default_limit:10m rate=100r/s;

server {
    location /api/v1/ {
        limit_req zone=$limit_bucket burst=5;
    }
}

注意事项

  1. 限流区域大小(如10m)大约可以存储16万个IP地址的状态
  2. 生产环境应先测试限流配置,避免误伤正常流量
  3. 可以结合日志监控限流效果: nginx limit_req_status 429; limit_conn_status 503; error_log /var/log/nginx/limit_errors.log;
  4. 对于API服务,可以在响应头中添加限流信息: nginx add_header X-RateLimit-Limit $limit_req; add_header X-RateLimit-Remaining $limit_req_remaining;

以上配置可以根据实际业务需求进行调整,建议在测试环境验证后再应用到生产环境。