关于 Nginx 的 Limit_req 限速模块的使用记录

2020-04-03 1961点热度 0人点赞

Nginx 有一个专门针对用户访问的限速模块,它允许管理者在指定时间范围内限制用户可以发出的 HTTP 请求数量。


1 、模块简介

ngx_http_limit_req_module 模块(0.7.21)适用于限制每一个满足条件的来源请求的处理速率,常见于针对单一 IP 地址请求的处理速率。

模块整体使用 “漏斗” 算法实现限制。 [ 链接 ]


2 、模块配置格式

该模块一共有五个参数,每个单参数内存在一些微调项。

格式:limit_req_zone key zone=name:size rate=rate; 
默认:无
位置:http

限速配置核心,建议配合 limit_req 使用以满足瞬时请求情况

参数格式参照 
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
key 为 变量,可用 map 制造出所需要的自定义变量。常用于 limit_req_zone 的变量是 $binary_remote_addr 
zone one 为 区域名,此处为创建区域名,关联 limit_req 参数使用
size 10m 为 区域缓存大小,区域内匹配的单元会统计总体大小,超过时会报错
rate 1r/s 为 请求处理速度,指定区域内对请求的标准处理速度。

格式: limit_req zone=name [burst=number] [nodelay | delay=number]; 
默认: 无
位置: http, server, location

限速配置扩展,需要配合 limit_req_zone 使用

参数格式参照
limit_req zone=one burst=5 delay=3;
zone one 为 区域名,此处为关联区域名,关联 limit_req_zone 参数使用
burst 5 为 峰值请求数,未超过峰值的请求延迟,超过峰值的请求报错
delay 3 为 延迟请求数,指定区域内对请求的第一次最高处理请求数,之后的会延迟,总数超过峰值的则丢弃。

剩下的是三个不重要参数项

含义:启动无过滤模式,启用后不会过滤请求,但是仍然会记录速率超量的日志
格式:limit_req_dry_run on | off;
默认:limit_req_dry_run off;
位置:http, server, location
含义:当服务器处于速率超量而拒绝处理请求或延迟处理请求的情况下,所需的日志记录级别
格式:limit_req_log_level info | notice | warn | error;
默认:limit_req_log_level error;
位置:http, server, location
含义:当服务器拒绝处理请求时返回的响应状态代码
格式:limit_req_status code;
默认:limit_req_status 503;
位置:http, server, location

3 、模块配置样例

3.1 、示例参考

http {
  geo $limit {
    default 1;
    10.0.0.0/8 0;
  }
  map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
  }
  limit_req_zone $limit_key zone=req_zone:10m rate=5r/s;
  server {
    location / {
    limit_req zone=req_zone burst=10 nodelay;
    }
  }
}

3.2 、示例效果

10.0.0.1 访问该 server 时,匹配为 limit=0 ,匹配 limit_key="",因为无字段所以无限制
172.16.0.1 访问该 server 时,匹配为 limit=1 ,匹配 limit_key="$binary_remote_addr",匹配限制 zone=req_zone:10m rate=5r/s

无 nodelay 匹配后,一秒发送 5 个请求,一秒内处理 5 个,无延迟,无报错
无 nodelay 匹配后,第一秒发送 8 个请求,一秒内处理 5 个,延迟 3 个,无报错
无 nodelay 匹配后,第二秒发送 8 个请求,一秒内处理 5 个,延迟 5 个,报错 3 个
无 nodelay 匹配后,第一秒发送 11 个请求,一秒内处理 5 个,延迟 5 个,报错 1 个
无 nodelay 匹配后,第二秒发送 11 个请求,一秒内处理 5 个,延迟 5 个,报错 6 个
无 nodelay 匹配后,一秒发送 17 个请求,一秒内处理 5 个,延迟 5 个,报错 7 个

带 nodelay 匹配后,一秒发送 5 个请求,一秒内处理 5 个,无报错
------------
带 nodelay 匹配后,第一秒发送 8 个请求,一秒内处理 8 个,无报错
带 nodelay 匹配后,第二秒发送 8 个请求,一秒内处理 7 个,报错 1 个(计算峰值包含了上次多的三个处理)
带 nodelay 匹配后,第二秒发送 8 个请求,一秒内处理 5 个,报错 3 个(上次处理数已经超过峰值,仅处理 rate)
------------
带 nodelay 匹配后,第一秒发送 10 个请求,一秒内处理 10 个,无报错
带 nodelay 匹配后,第三秒发送 10 个请求,一秒内处理 10 个,无报错
------------
带 nodelay 匹配后,第一秒发送 14 个请求,一秒内处理 10 个,报错 4 个
带 nodelay 匹配后,第二秒发送 14 个请求,一秒内处理 5 个,报错 9 个
带 nodelay 匹配后,第三秒发送 14 个请求,一秒内处理 5 个,报错 9 个
------------
带 nodelay 匹配后,一秒发送 17 个请求,一秒内处理 14 个,报错 3 个


4 、模块使用问题

暂无


5 、参考链接

Module ngx_http_limit_req_module [ 链接 ]

Rate Limiting with NGINX and NGINX Plus [ 链接 ]

Limiting Access to Proxied HTTP Resources [ 链接 ]

nginx 中的 limit_req 限速设置配置示例 [ 链接 ]

Module ngx_http_limit_conn_module [ 链接 ]

Module ngx_http_core_module #limit_rate [ 链接 ]

StarryVoid

Have a good time