limit_req_zone 知识点(写在 http 块中):
格式:limit_req_zone key zone=name:size rate=rate;
| 参数 | 说明 |
|---|---|
key | 限流的维度标识(即“谁被限流”)。可以是变量、变量组合、固定字符串。 |
zone=name:size | 定义共享内存区域: - name:zone 名称(后续通过 limit_req zone=name 引用)- size:内存大小(如 10m = 10MB),用于存储所有 key 的状态 |
rate=rate | 允许的平均请求速率,格式为: - number r/s(每秒请求数)- number r/m(每分钟请求数)例如: rate=1r/s、rate=30r/m |
在限流的时候,设置如(
rate=10r/m)。不是代表着只要是在一分钟内就可以连续请求 10 次,而是把 10 次均摊到每分钟,也就是说按照左边的案例来算,6秒才能请求一次服务器共每分钟10次
limit_req 知识点:
格式:limit_req zone=name [burst=number] [nodelay] [delay=number];
| 参数 | 说明 |
|---|---|
zone=name | 引用一个已通过 limit_req_zone 定义的共享内存区域(必需) |
burst=number | 允许突发的请求数(即“桶容量”),默认为 0 |
nodelay | 若设置了 burst,加上此参数表示突发请求立即处理(不排队) |
delay=number | (高级)控制从第几个请求开始延迟(较少使用) |
存放位置:
| 位置 | 作用范围 |
|---|---|
http 块 | 对所有请求生效(全局) |
server 块 | 对该虚拟主机(域名/IP+端口)下所有路径生效 |
location 块 | 仅对匹配的 URI 路径生效 |
示例:
| 配置 | 行为描述 |
|---|---|
limit_req zone=x; | 严格按 rate 放行。超过速率 → 立即返回 503(或自定义状态码) |
limit_req zone=x burst=5; | 允许最多 1 + 5 = 6 个请求:- 第 1 个立即处理 - 第 2~6 个排队等待(按 rate 逐个放行) - 第 7 个及以上 → 拒绝 |
limit_req zone=x burst=5 nodelay; | 允许 6 个请求全部立即处理,之后严格限流(超速即拒) |
burst是“缓冲区”,不是“额外配额”。它用于吸收瞬时流量高峰,避免误杀正常用
limit_req_status 429是 Nginx 中用于自定义限流拒绝响应状态码的指令
