Nginx 中如何通过配置进行 API 访问的流量控制

作者:袖梨 2026-07-20
Nginx通过limit_req和limit_conn模块实现API流量控制,先在http块定义限流区域(如zone=api_limit:10m rate=20r/s),再在location中启用limit_req(支持burst/nodelay)和limit_conn双策略,按IP或用户标识精细化限流。

在 Nginx 中实现 API 访问的流量控制,核心是用 limit_req 模块做请求速率限制,配合 limit_conn 控制并发连接数,再结合 IP 或用户标识做精细化管控。它不依赖后端,直接在入口层拦截或平滑异常流量,成本低、见效快。

定义限流区域(关键第一步)

限流状态需要共享存储,必须在 http 块中用 limit_req_zone 定义:

  • Key 选什么:常用 $binary_remote_addr(压缩后的客户端 IP),比 $remote_addr 更省内存;若需按用户限流,可用 $cookie_uid$arg_token 提取认证标识
  • Zone 名称和大小:如 zone=api_limit:10m,10MB 内存约支持 16 万个独立 IP 的计数状态
  • rate 设置:例如 rate=20r/s 表示每秒最多 20 个请求;也可写成 rate=1200r/m(每分钟 1200 次),语义更直观

在 API 路径上启用限流

把限流策略绑定到具体 location,比如只对 /api/ 下的接口生效:

  • 基础用法:limit_req zone=api_limit; —— 超出速率的请求直接返回 503
  • 允许突发流量:limit_req zone=api_limit burst=30; —— 多余请求进入队列,按设定速率排队处理
  • 立即响应突发:limit_req zone=api_limit burst=30 nodelay; —— 队列里请求不排队,立刻转发(注意:瞬时峰值可能突破 rate)

叠加并发连接限制

仅控请求数还不够,恶意客户端可能建大量长连接耗尽资源。用 limit_conn 补齐:

  • 先定义连接区:limit_conn_zone $binary_remote_addr zone=conn_limit:1m;
  • 再应用:limit_conn conn_limit 10; —— 单个 IP 最多保持 10 个并发连接
  • 可与 limit_req 共存,两者独立生效,形成“请求频次 + 连接数量”双保险

区分场景灵活配置

不同 API 敏感度不同,别一刀切:

  • 登录接口易受暴力破解,建议严控:rate=5r/m(每分钟 5 次)+ burst=2 nodelay
  • 公开查询接口可宽松些:rate=100r/m,加 burst=20 缓冲爬虫波动
  • 付费用户或内部调用,可通过 header 或 token 提取标识,单独设 zone,避免影响普通用户

相关文章

精彩推荐