Nginx 配置限流

December 27, 2024 作者: southern 分类: 浏览: 3 评论: 0

在高并发环境下,合理的限流策略可以有效保护服务器资源,防止恶意攻击和异常流量冲击。这里介绍Nginx 的四种主要限流方式,包括 请求速率限流连接数限流请求体大小限流带宽限流

1. 请求速率限流

请求速率限流用于控制单位时间内的请求数,防止单个 IP 频繁访问 API 或网页,造成服务器压力过大。

# 定义限流区域,每个 IP 每秒最多 10 个请求
limit_req_zone $binary_remote_addr zone=req_rate_zone:10m rate=10r/s;
​
server {
    listen 80;
    server_name localhost;
​
    location /api/ {
        # 限制请求速率,每秒最多 10 个请求,允许 20 次突发请求
        limit_req zone=req_rate_zone burst=20 nodelay;
            
        proxy_pass http://xxx.com;
                
        #其它配置
    }
}
  • limit_req_zone key zone=name:size rate=rate;

    • key:限流的依据(通常使用 $binary_remote_addr 代表 IP)。

    • zone=name:size:定义共享内存区域 name,用于存储限流信息,size 决定可存储多少条记录(10M 大约存储 16 万个条目)。

    • rate=rate:定义限流速率(单位 r/s,即请求数/秒)。作用:基于IP 地址进行限流,每秒最多 10 个请求。

  • limit_req zone=name [burst=number] [nodelay];

    • burst=number:允许的突发请求数量(即短时间内超额请求的缓冲)。

    • nodelay:如果请求超出速率但在突发范围内,立即处理(不等待)。

    • 超过 burst 阈值的请求会返回 503 Service Unavailable。

使用场景

  • API 接口限流,防止恶意刷接口请求。

  • 保护后端数据库查询,防止高频访问导致数据库崩溃。

2. 连接数限流

Nginx 支持限制同一 IP 的并发连接数,以防止某个 IP 过度占用资源。

# 定义连接数限制,每个 IP 允许的最大并发连接数为 5
limit_conn_zone $binary_remote_addr zone=conn_limit_zone:10m;
​
server {
    listen 80;
    server_name localhost;
​
    location / {
        # 限制每个 IP 最大 5 个并发连接
        limit_conn conn_limit_zone 5;
​
        proxy_pass http://xxx.com;
                
        #其它配置
    }
}
  • limit_conn_zone key zone=name:size;

    • key:限流的依据(一般使用 $binary_remote_addr 代表 IP)。

    • zone=name:size:定义共享内存区域,存储 IP 连接数信息。

  • limit_conn name number;

    • name:共享内存区域名称。

    • number:允许的最大并发连接数,超过该数量的请求会被拒绝。

使用场景

  • 适用于 Web 服务器,防止某个 IP 建立大量连接,导致其他用户无法访问。

  • 适用于 WebSocket 连接,限制每个用户的同时连接数。

3. 请求体大小限流

限制请求体大小可以防止恶意用户上传超大文件,造成服务器资源消耗过多。

server {
    listen 80;
    server_name localhost;
​
    location /upload/ {
        # 限制上传文件大小,最大 10MB
        client_max_body_size 10m;
​
        proxy_pass http://xxx.com;
                
        #其它配置
    }
}
  • client_max_body_size size;

    • size:最大允许的请求体大小(如 10m 表示 10MB)。

    • 如果请求体超过这个大小,Nginx 会返回 413 Request Entity Too Large 错误。

使用场景

  • 文件上传接口,防止用户上传超大文件。

  • 防止恶意请求占用服务器存储资源。

4. 带宽限流

带宽限流主要用于限制单个用户的下载速率,防止某些用户占用过多网络资源。

server {
    listen 80;
    server_name localhost;

    location /downloads/ {
        # 下载前 100KB 不限速,之后限速 50KB/s
        limit_rate_after 100k;
        limit_rate 50k;
        
        proxy_pass http://xxx.com;
        
        #其它配置
    }
}
  • limit_rate_after size;

    • size:在传输 size 字节之后再开始限速。

  • limit_rate rate;

    • rate:单位为字节/秒,表示最大下载速率。

使用场景

  • 限制静态资源(图片、视频、文件)下载速率,防止带宽被个别用户占用。

  • 视频点播或直播场景,平衡用户体验和服务器压力。

总结

限流方式

Nginx 配置

适用场景

请求速率限流

limit_req_zone + limit_req

API 接口防刷,防止请求过载

连接数限流

limit_conn_zone + limit_conn

限制 IP 并发连接数,防止资源被占用

请求体大小限流

client_max_body_size

限制上传文件大小

带宽限流

limit_rate_after + limit_rate

控制下载速率

这些限流策略可以单独使用,也可以组合使用,根据不同业务需求调整配置。Nginx 自带的限流功能可以满足大多数需求。如果有需要,结合 Redis + Lua 进行扩展可以实现更复杂的限流(如动态调整限流规则、分布式限流等)。

#2024(13)

评论