Nginx的limit_req_zone基于漏桶算法实现请求限流,rate设定恒定处理速率,burst定义缓冲队列长度,nodelay控制超限请求是拒绝还是延迟;需结合业务特征调优粒度、分层策略与监控。
Nginx 的
指令底层正是基于漏桶(Leaky Bucket)算法实现的请求限流机制,它能有效缓冲突发流量、平滑后端接口压力,而不是简单粗暴地拒绝请求(像令牌桶那样可能允许短时爆发)。关键在于合理配置速率、桶容量和行为策略。
理解 limit_req_zone 的漏桶语义
漏桶模型中:请求是“水滴”,桶有固定容量(burst),水以恒定速率(rate)从底部漏出(即被处理)。当新请求到来,若桶未满则入桶排队;若已满则被拒绝或延迟。Nginx 中:
表示每秒稳定处理 10 个请求(漏出速率)
表示桶最多暂存 20 个等待请求(缓冲区大小)
超出
的请求,默认立即返回 503,也可用
改为拒绝而非排队
基础配置示例与关键参数说明
在
块中定义限流区域:
在
中启用:
说明:
Nginx
在宝塔面板中轻松管理Nginx高性能Web服务器。提供可视化配置反向代理、负载均衡、SSL证书及HTTP缓存功能,一键优化高并发性能,助您高效搭建稳定、快速的网站运行环境。
下载
:用二进制 IP 地址做键,内存更省、查找更快(比
节省约 60% 内存)
:分配 10MB 共享内存存储计数器,可支撑约 16 万个独立 IP 的状态
:允许最多 15 个请求暂存在“桶”中排队,配合
,意味着最多可吸收 3 秒的突发(15 ÷ 5 = 3s)
:对超出
的请求直接拒绝(503),不排队等待;去掉它,则超限请求会按漏桶节奏延迟执行(可能造成长尾)
应对真实业务场景的调优建议
单纯套用默认值容易误伤或失效:
区分用户粒度
:对登录用户可用
或
(需 base64 解码前缀)替代 IP,避免共享 IP(如企业出口)导致误限
分层限流
:全局 IP 限流 + 接口级 key 限流(如
),兼顾安全与体验
平滑突发而非压制
:若业务允许一定延迟(如异步任务提交),去掉
,让 Nginx 自动延时调度请求,后端看到的是均匀流量
监控与反馈
:开启
,配合日志字段
和
统计被限请求数,用于动态调参
常见误区与验证方法
容易忽略的细节:
漏桶的“漏”是匀速的,
单位用
更稳定;
在低频场景下因精度问题可能导致实际速率波动
不是并发数,而是排队请求数;真正并发压力取决于后端处理能力和 upstream 超时设置
测试时别只用
或单线程压测 —— 用
模拟多连接突发,观察响应码分布(200 / 503)和延迟 P95 变化
注意时间窗口:Nginx 漏桶是连续滑动窗口,不是固定周期(如每秒重置),因此无“秒初突增”问题
漏桶的核心价值,在于把不可控的脉冲式请求,转化为后端可消化的稳定水流。配置本身不复杂,但必须结合业务吞吐特征、用户行为模式和错误容忍度来设计 rate 与 burst 的平衡点。
limit_req_zonerate=10r/sburst=20burstnodelayhttplimit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;locationlocation /api/v1/submit {
limit_req zone=api_limit burst=15 nodelay;
proxy_pass http://backend;
}$binary_remote_addr$remote_addrzone=api_limit:10mburst=15rate=5r/snodelayburst$cookie_user_id$http_authorizationlimit_req_zone $uri zone=per_uri:10m rate=100r/mnodelaylimit_req_log_level error$limit$limit_raterater/sr/mburstabwrk -t4 -c100 -d10s