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 [ 链接 ]