Skip to content

Nginx 限流

在高并发场景下,Nginx 限流是一种常见的 流量控制手段。 它可以有效防止 突发流量冲击恶意攻击,保护后端服务的稳定性。

Nginx 提供了 两种限流机制

  1. 连接数限流:限制单个 IP 的并发连接数
  2. 请求速率限流:限制请求的速率(QPS)

✨ 限流方式

1. 请求速率限流(limit_req

基于 令牌桶算法,限制单位时间的请求数。

配置示例

nginx
http {
    # 定义一个限流区域 (10MB 内存,可存储约16万个IP状态)
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;

    server {
        location /api/ {
            # 应用限流规则
            limit_req zone=req_limit burst=10 nodelay;
        }
    }
}

参数说明

  • limit_req_zone key zone=name:size rate=rate

    • key:作为限流依据的变量(如 $binary_remote_addr 代表客户端 IP)
    • zone=name:size:定义共享内存区域,用于存储状态
    • rate=rate:请求速率,例如 5r/s 表示每秒 5 个请求
  • limit_req zone=name [burst=n] [nodelay]

    • burst:允许的突发请求数
    • nodelay:突发请求立即执行(不进入排队)

示例效果

  • 单个 IP 每秒最多 5 个请求
  • 突发请求最多允许 10 个

2. 并发连接数限流(limit_conn

限制单个 IP 的并发连接数,避免恶意用户长时间占用连接。

配置示例

nginx
http {
    # 定义一个限流区域
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

    server {
        location /download/ {
            # 单个 IP 最多保持 2 个并发连接
            limit_conn conn_limit 2;
        }
    }
}

参数说明

  • limit_conn_zone key zone=name:size 定义共享内存区域,按 key(如 IP)统计连接数

  • limit_conn zone_name number 限制某个 key 的最大并发连接数


3. 配合使用示例

综合使用请求限流和连接数限流:

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

    server {
        location / {
            limit_req zone=req_limit burst=20 nodelay;
            limit_conn conn_limit 5;
        }
    }
}
  • 单个 IP 每秒请求数限制为 10(突发最多 20)
  • 单个 IP 并发连接数限制为 5

🚦 应用场景

  1. 防止接口被刷

    • 限制 API 请求速率,防止恶意爬虫或攻击
  2. 防止下载资源滥用

    • 限制并发连接数,避免单个用户占用过多带宽
  3. 保护后端服务

    • Nginx 在前端限流,避免数据库、应用服务器被压垮

⚠️ 注意事项

  • 限流配置需合理,过严可能影响正常用户体验

  • 对静态资源(如图片、CSS、JS)一般不需要限流

  • 结合 防火墙 / WAF / CDN,效果更佳

  • 监控日志(error.log)中会出现:

    • limiting requests, excess: 1.000(请求被限流)

🔗 参考资料

Released under the MIT License.