插件窝 干货文章 怎么设置nginx限流

怎么设置nginx限流

limit zone 请求 限制 60    来源:    2025-04-22

Nginx限流配置指南

Nginx提供了多种限流方式,可以有效防止服务器过载或被恶意攻击。以下是几种常见的Nginx限流配置方法:

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

限制单个IP的并发连接数:

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

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

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

限制单个IP的请求速率:

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

    server {
        location / {
            limit_req zone=one burst=20 nodelay;
            # 平均每秒不超过10个请求
            # 突发不超过20个请求
        }
    }
}

3. 限制下载速度(ngx_http_core_module)

限制客户端下载速度:

location /download/ {
    limit_rate 100k;  # 限制速度为100KB/s
    limit_rate_after 1m; # 下载超过1MB后开始限速
}

4. 综合限流配置示例

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 {
        listen 80;

        # 全局限制
        limit_conn conn_limit 20;

        location /api/ {
            # API接口更严格的限制
            limit_req zone=req_limit burst=10 nodelay;
            limit_conn conn_limit 5;
        }

        location /static/ {
            # 静态资源限速
            limit_rate 500k;
        }
    }
}

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;

注意事项

  1. zone=name:size 定义共享内存区域,用于存储状态
  2. rate 可以是 r/s(每秒请求数) 或 r/m(每分钟请求数)
  3. burst 允许突发请求数
  4. nodelay 表示不延迟处理突发请求,而是直接拒绝超过限制的请求
  5. 限流配置应根据实际业务需求调整,避免误伤正常用户
  6. 测试时建议先设置较宽松的限制,逐步收紧

以上配置可以根据实际需求组合使用,实现对Nginx服务器的全方位流量控制。