Nginx限流需两步:先在http块用limit_req_zone定义规则,再在location块用limit_req引用zone;必须配套使用,否则nginx -t报错。

在 Nginx 的 location 块里加限流,核心就两步:先定义规则(在 http 块),再引用规则(在 location 块)。直接写在 location 里的是 limit_req 或 limit_conn 指令,它们必须对应前面已声明的 zone 名称。
限流指令必须放在 location 块内
limit_req 和 limit_conn 是实际启用限流的指令,只能出现在 server 或 location 上下文中。例如:
location /api/login {
limit_req zone=login_rate burst=3 nodelay;
limit_conn conn_per_ip 5;
proxy_pass http://backend;
}✅ 这样写才生效;❌ 不能只写 limit_req zone=xxx 却没在 http 块里定义 limit_req_zone,否则 nginx -t 会报错。
常见限流组合写法
-
防暴力登录(每分钟1次)
limit_req zone=login_limit burst=2 nodelay;
配合
http块中:limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/m; -
API 接口限速(每秒10次,允许突发20)
limit_req zone=api_limit burst=20;
burst不带nodelay时,超出部分会排队等待(按漏桶速率释放);加了nodelay就立刻放行或拒绝。 -
限制单 IP 并发连接数(防慢连接攻击)
limit_conn conn_per_ip 8; limit_conn_log_level error; limit_conn_status 503;
前提是
http块有:limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;
几个关键细节注意
-
burst值不是“额外额度”,而是缓冲队列长度:比如rate=5r/s+burst=10,意味着最多可瞬间接收15个请求(5个即时处理 + 10个排队),但后续仍按每200ms放行1个。 -
nodelay不等于“不限制”,它只是让排队请求不等漏桶排水,直接通过或拒绝——超过burst就返回 503。 - 同一个
location可同时用limit_req和limit_conn,互不干扰。 - 如果用了
proxy_pass,限流作用于 Nginx 接收到的请求,不是后端响应后才计算。
验证配置是否生效
改完后务必执行:
nginx -t && nginx -s reload
然后用 curl 或 ab 工具测试,观察响应状态码(429 或 503)和响应头中的 X-RateLimit-*(需配合 limit_req_status 和自定义 header 才显示)。


















