Nginx限流需两步:先在http块中用limit_req_zone定义共享内存区域(如zone=ip_limit:10m rate=5r/s),再在location中用limit_req引用(如zone=ip_limit burst=10 nodelay)。

直接在 Nginx 配置中启用 limit_req 限流,核心是两步:先定义限流规则空间,再在具体位置启用它。不需要额外安装模块,Nginx 默认已编译 ngx_http_limit_req_module(除非手动禁用过)。
定义限流共享内存区域(必须放在 http 块内)
这是限流的基础,所有后续限流都依赖这个区域存储 IP 计数状态:
-
用
$binary_remote_addr替代$remote_addr:节省内存,64 字节/记录,1MB 可存约 1.6 万个 IP 状态 -
zone=name:size:比如zone=ip_limit:10m表示分配 10MB 内存,命名为ip_limit -
rate=nr/s或nr/m:如rate=5r/s(每秒 5 个请求),或rate=30r/m(每分钟 30 个,适合低频接口)
示例:
http {limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=5r/s;
}
在 location 或 server 中启用限流规则
把定义好的区域应用到实际路径,可灵活控制范围:
-
zone=name:必须与上面定义的 zone 名称一致 -
burst=N:设置缓冲队列大小,允许突发 N 个请求(超出 rate 的请求先进队列) -
nodelay:队列中的请求不排队等待,立即处理;不加则按漏桶节奏匀速放出 - 不写
nodelay且burst超出时,多余请求会被延迟,延迟超时或队列满则返回503
示例(限制登录接口):
location /login {limit_req zone=ip_limit burst=10 nodelay;
proxy_pass http://backend;
}
可选增强配置
让限流行为更可控、更清晰:
-
limit_req_status 429:把默认的503改成标准限流响应码429 Too Many Requests -
limit_req_log_level warn:只对被拒绝/延迟的请求记 warning 日志,避免日志刷屏 -
组合键限流:如
limit_req_zone $binary_remote_addr$request_uri zone=uri_per_ip:10m rate=2r/s,实现“每个 IP 对每个 URL 单独限流”
验证与调试要点
上线前建议确认几件事:
- 修改后执行
nginx -t检查语法,再nginx -s reload生效 - 观察 error.log 是否出现
limiting requests相关警告,确认规则触发 - 用
ab或wrk工具模拟压测(如wrk -t2 -c100 -d5s http://site/login),看是否按预期拦截 - 注意:限流基于客户端真实 IP;若前端有代理(如 CDN、负载均衡),需确保
$binary_remote_addr被正确替换为真实源 IP(通常靠real_ip_header X-Forwarded-For+set_real_ip_from实现)


















