nginx内部api限流必须分两步:第一步在http块定义limit_req_zone规则(如按ip、用户id或uri),第二步在location块用limit_req启用并配置burst/nodelay等参数,缺一不可;还需处理代理ip错位及实测验证。

直接在 Nginx 中为内部 API 接口加访问频率限制,关键不是“能不能做”,而是“怎么配才真正生效且不误伤”。它必须分两步走:先定义规则,再绑定到具体路径。漏掉任一环节,配置就等于没写。
第一步:在 http 块里定义限流区域
所有限流规则必须写在 http{...} 大括号内,不能放在 server 或 location 里,否则 Nginx 启动会报错:“limit_req_zone directive is not allowed here”。常用写法:
-
按 IP 限流(最常用):
limit_req_zone $binary_remote_addr zone=api_internal:10m rate=20r/s;
推荐用$binary_remote_addr(二进制 IP),比$remote_addr更省内存、哈希更稳;10m约支持 16 万个并发客户端状态。 -
按用户身份限流(更精准):
limit_req_zone $http_x_user_id zone=user_api:10m rate=5r/s;
前提是后端或网关在请求头中透传了X-User-ID,这样同一用户无论从哪台机器调用,都算一个流量主体。 -
按接口路径区分限流(适合混合部署):
limit_req_zone $request_uri zone=path_limit:10m rate=10r/m;
比如报表导出接口/api/v1/export每分钟最多 10 次,而普通查询接口可设得宽松些。
第二步:在 location 块中启用并细化行为
找到你内部 API 的 location,比如 location /internal/ 或 location /api/v2/,在里面加上 limit_req 指令:
-
基础启用:
limit_req zone=api_internal burst=10;
表示平均 20r/s,允许最多 10 个请求排队等待处理(漏桶式匀速放出)。 -
拒绝突发、立即响应:
limit_req zone=api_internal burst=10 nodelay;
超限请求不排队,立刻返回 503;适合对延迟敏感或后端扛不住排队的场景。 -
统一返回友好码:
limit_req_status 429;
把默认的 503 改成标准限流码 429,前端容易识别和重试。 -
记录日志便于排查:
limit_req_log_level warn;
在 error.log 中看到 “limiting requests, excess: X.XXX by zone 'api_internal'”,说明真在起作用。
第三步:绕过代理 IP 错位问题(内部环境常见)
如果内部 API 前面有 Kubernetes Ingress、HAProxy 或自建网关,$binary_remote_addr 拿到的可能是中间代理的 IP,导致全站被同一限流策略卡住。解决方法:
- 确认上游是否透传真实客户端 IP,通常通过
X-Real-IP或X-Forwarded-For头; - 改用键值:
limit_req_zone $http_x_real_ip zone=api_internal:10m rate=20r/s;; - 同时确保 Nginx 配置了
set_real_ip_from和real_ip_header,否则$http_x_real_ip为空。
验证是否真的生效
别只信 reload 成功——必须实测:
- 用
ab -n 50 -c 10 http://your.internal/api/health快速压测; - 观察响应码是否出现 429 或 503;
- 实时查看
tail -f /var/log/nginx/error.log,搜limiting或excess关键字; - 注意:若用 curl 测试,记得加
-H "X-Real-IP: 192.168.10.100"模拟不同来源,避免单 IP 被限死。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











