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 定义:
$binary_remote_addr(压缩后的客户端 IP),比 $remote_addr 更省内存;若需按用户限流,可用 $cookie_uid 或 $arg_token 提取认证标识zone=api_limit:10m,10MB 内存约支持 16 万个独立 IP 的计数状态rate=20r/s 表示每秒最多 20 个请求;也可写成 rate=1200r/m(每分钟 1200 次),语义更直观把限流策略绑定到具体 location,比如只对 /api/ 下的接口生效:
limit_req zone=api_limit; —— 超出速率的请求直接返回 503limit_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 缓冲爬虫波动