用limit_req模块限速需两步:先在http块中用limit_req_zone定义基于ip等键的共享内存限速区域,再在location块中用limit_req启用并配置burst、nodelay等参数。

用 limit_req 模块限制接口请求速率,核心是两步:先定义一个基于客户端 IP 的限速区域,再在具体接口路径上启用这个限制。它不是开箱即用的功能,必须手动配置,且依赖 Nginx 已编译进 ngx_http_limit_req_module 模块(主流发行版默认包含)。
定义限速区域(在 http 块中)
限速信息需要存放在共享内存里,供所有 worker 进程共用。用 limit_req_zone 指令声明:
-
$binary_remote_addr是最常用键,表示按客户端真实 IP 限速,比$remote_addr更省内存; -
zone=api_rate:10m表示创建名为api_rate、大小为 10MB 的共享内存区(1MB 约存 1.6 万个 IP 记录); -
rate=10r/s设定基础速率,即每秒最多放行 10 个请求;也可写成60r/m(每分钟 60 次),效果等价。
示例配置:
http {limit_req_zone $binary_remote_addr zone=api_rate:10m rate=10r/s;
}
对特定接口启用限速(在 location 块中)
仅定义区域不会生效,必须在目标接口的 location 中调用 limit_req:
-
zone=api_rate引用前面定义的区域; -
burst=20设置缓冲队列长度,允许突发流量临时排队,避免简单丢弃影响用户体验; -
nodelay表示对符合 burst 容量的请求立即处理,不匀速延迟;若去掉该参数,Nginx 会按固定节奏释放请求(漏桶式平滑); - 超出 burst 的请求默认返回
503 Service Temporarily Unavailable,可加limit_req_status 429改为更语义化的限流状态码。
示例配置(限制所有 /api/ 开头的请求):
limit_req zone=api_rate burst=20 nodelay;
proxy_pass http://backend;
}
支持更精细的限速粒度
如果需区分不同接口或用户身份,可调整 limit_req_zone 的 key:
- 按 URL 限速:
limit_req_zone $binary_remote_addr$uri zone=url_rate:10m rate=5r/s;(同一 IP 访问不同路径各自独立计数); - 按请求头识别用户:
limit_req_zone $http_x_user_id zone=user_rate:10m rate=3r/s;(需客户端配合传入唯一 ID); - 组合条件:
limit_req_zone $binary_remote_addr$http_host zone=host_ip:10m rate=15r/s;(按 IP+域名 组合限速)。
验证与调试要点
配置后务必执行检查并重载:
- 运行
nginx -t确认语法无误; - 用
nginx -s reload生效新配置; - 可通过反复请求接口 + 查看响应头
X-RateLimit-Limit和X-RateLimit-Remaining(需配合add_header手动输出)辅助判断; - 错误日志中出现
limiting requests字样,说明限速已触发。











