nginx 不支持系统级资源配额,但可通过 limit_req 和 limit_conn 实现请求速率与并发连接的多维度控制;支持按 ip、api key、租户+接口等粒度配置,可叠加多级 zone 进行分层限流,超限默认返回 503 或自定义 429,适用于网关层轻量限流。

Nginx 本身不支持 CPU、内存等系统级资源配额,但可通过 limit_req 和 limit_conn 模块,在请求层面实现按客户端、接口、租户等维度的配额管理——本质是速率与并发控制,而非资源占用限制。
请求速率配额(按秒/分钟计数)
用 limit_req_zone 定义配额桶,key 决定配额归属粒度:
-
$binary_remote_addr→ 单 IP 配额 -
$http_apikey→ API Key 级配额(需前端传入) -
$arg_appid:$uri→ 租户 + 接口组合配额 -
$http_x_real_ip:$uri→ IP + 接口联合配额
配置示例(每分钟最多 300 次):
http {
limit_req_zone $http_apikey zone=api_quota:10m rate=5r/s;
# 5r/s ≈ 300r/m,实际按秒滑动窗口计算
}
server {
location /api/ {
limit_req zone=api_quota burst=20 nodelay;
proxy_pass http://backend;
}
}
-
burst=20:允许突发 20 个请求(缓冲队列) -
nodelay:队列内请求立即处理,不匀速释放 - 超限默认返回
503,可自定义limit_req_status 429
并发连接配额(同时活跃请求数)
用 limit_conn_zone 控制同一 key 的最大并发连接数:
http {
limit_conn_zone $binary_remote_addr zone=ip_conn:10m;
}
server {
location /upload/ {
limit_conn ip_conn 5; # 单 IP 最多 5 个并发上传连接
client_max_body_size 100M;
proxy_pass http://upload_backend;
}
}
- 适用于文件上传、长轮询等易占连接场景
-
limit_conn作用于 TCP 连接数,不是 HTTP 请求数
多级配额叠加(接口 + 租户 + 全局)
可嵌套使用多个 zone,实现分层管控:
http {
# 全局总速率上限(防雪崩)
limit_req_zone $server_name zone=global_rate:10m rate=1000r/s;
# 租户级配额
limit_req_zone $arg_appid zone=tenant:10m rate=200r/s;
# 关键接口强限流
limit_req_zone $uri zone=critical_api:10m rate=10r/s;
}
location /api/v1/order/submit {
limit_req zone=global_rate burst=100 nodelay;
limit_req zone=tenant burst=30 nodelay;
limit_req zone=critical_api burst=5 nodelay;
proxy_pass http://order_service;
}
- 请求依次匹配多个
limit_req,任一触发即拒绝 - 建议按“宽泛→精细”顺序排列 zone,避免误拦截
配额效果验证与调优
- 查看实时状态:
nginx -T | grep limit确认配置加载 - 日志标记:在
log_format中加入$limit变量记录是否被限 - 监控指标:通过
stub_status或 Prometheus Exporter 抓取limit_req拒绝数 - 动态调整:修改 zone rate 后
nginx -s reload即生效,无需重启进程
Nginx 的请求级配额是轻量、低延迟、无状态的,适合前置网关层做第一道流量闸门。真正需要 CPU/内存硬隔离时,应交由容器平台(如 Kubernetes ResourceQuota)或宿主机 cgroups 统一管控。











