插件窝 干货文章 怎么用Nginx限制访问频率、下载速率和并发连接数

怎么用Nginx限制访问频率、下载速率和并发连接数

limit 限制 zone rate 462    来源:    2025-04-24

使用Nginx限制访问频率、下载速率和并发连接数

Nginx提供了多种模块来限制客户端访问行为,可以有效防止滥用和DDoS攻击。以下是详细的配置方法:

1. 限制访问频率(限流)

使用ngx_http_limit_req_module模块限制请求频率:

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

    server {
        location / {
            limit_req zone=req_limit burst=20 nodelay;
            # 其他配置...
        }
    }
}
  • limit_req_zone定义限制区域:

    • $binary_remote_addr:基于客户端IP
    • zone=req_limit:10m:分配10MB内存存储状态
    • rate=10r/s:限制每秒10个请求
  • limit_req应用限制:

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

2. 限制下载速率

使用ngx_http_core_modulelimit_rate指令:

location /download/ {
    limit_rate 100k;  # 限制为100KB/s
    limit_rate_after 1m;  # 前1MB不限速
}
  • limit_rate:限制传输速率
  • limit_rate_after:达到指定大小后开始限速

3. 限制并发连接数

使用ngx_http_limit_conn_module模块:

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

    server {
        location / {
            limit_conn conn_limit 5;  # 每个IP最多5个并发连接
            # 其他配置...
        }
    }
}
  • limit_conn_zone定义限制区域
  • limit_conn应用连接数限制

4. 综合应用示例

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

    server {
        listen 80;

        # 静态文件下载限速
        location /static/ {
            limit_rate 200k;
            limit_rate_after 500k;
        }

        # API接口限流
        location /api/ {
            limit_req zone=req_zone burst=10 nodelay;
            limit_conn conn_zone 3;

            proxy_pass http://backend;
        }
    }
}

5. 高级配置技巧

  1. 白名单设置
geo $limit {
    default 1;
    192.168.1.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. 不同URL不同限制
map $uri $limit_rate {
    ~*\.(mp4|flv)$ 500k;
    default 1m;
}

server {
    location / {
        limit_rate $limit_rate;
    }
}
  1. 日志记录被限制的请求
limit_req_status 429;
limit_conn_status 429;

log_format rate_limit '$remote_addr - $remote_user [$time_local] '
                     '"$request" $status $body_bytes_sent '
                     '"$http_referer" "$http_user_agent" - $server_name '
                     'Zone: $limit_req_status';

access_log /var/log/nginx/rate_limit.log rate_limit;

这些配置可以帮助您有效控制服务器的资源使用,防止滥用和恶意攻击。根据实际需求调整参数值以达到最佳效果。