ngx_http_limit_req_module
ngx_http_limit_req_module模块按照定义的key值限制请求处理速率,特别是对来自单个IP请求的速率限制。
limit_req_zone指令
-
按key设置一块共享内存存储状态信息、超限请求数量;key可以包含文本、变量、文本和变量的组合。如果请求中的key为空不会计算到请求数量中。
-
limit_req_zone指令只能设置在http块中。
-
语法:
limit_req_zone key zone=name:size rate=rate [sync];
-
例:
limit_req_zone $binary_remote_addr zone=one:10m rate=3r/s;
。
-
-
$binary_remote_addr
将客户端IP设置为key(按客户端IP限制速率)。
-
zone=one:10m
表示区域命名为one,10m内存空间;如果10m空间用完,按最近最少使用原则移除状态数据,如果空间仍然不够就拒绝处理新请求(返回503)。
-
rate=3r/s
表示速率为每秒3个请求,单位r/s
表示每秒请求数,如果要设置的速率小于1r/s
,可以使用r/m
单位,表示每分钟请求数。
-
sync
用于集群节点间的共享内存数据同步,这里不介绍。
-
limit_req指令
-
limit_req指令用于限制请求速率。
-
limit_req会设置一块内存区域用于实现/管理速率限制,可以给这块内存设置区域名、空间大小、速率、瞬间最大请求量。
-
如果请求速率超过设置,nginx会按设置的速率平滑处理请求(将一些请求延迟处理以达到设置速率)。
-
超过瞬间最大请求量以前的请求会被延迟处理,而超过瞬间最大请求量的请求不会被处理,直接返回错误状态码为503,可以用limit_req_status指令自定义错误状态码。
-
瞬间最大请求量默认值为0。
-
语法:
limit_req zone=name [burst=number] [nodelay | delay=number];
。
-
-
zone=name
设置区域名。
-
burst=number
设置瞬间最大请求量。
-
nodelay
表示不延迟处理请求。
-
delay=number
表示延迟处理的请求数量,默认值为0,即所有超过速率限制的请求都会被延迟。
-
7. 只有当前配置块(级别)没有设置limit_req指令时,才会从上一个配置块继承配置。
8. limit_req指令可以设置多个,如以下配置:限制同个客户端IP的请求速率,同时也限制虚拟主机的请求速率。
server {
...
limit_req zone=perip burst=5 nodelay;
limit_req zone=perserver burst=10;
}
limit_req_statu指令
设置拒绝处理的状态码,默认值为503 语法:limit_req_status code;
可配置块:http, server, location
limit_req_log_level指令
1. 设置拒绝处理和延迟处理的日志级别,延迟处理级别比拒绝处理级别低一级,如imit_req_log_level notice
表示拒绝处理为notice级,延迟处理低一级为info。
2. 语法 :limit_req_log_level info | notice | warn | error;
默认日志级别:error 可配置块:http, server, location
测试
测试1. 限制同一IP每秒3个请求,nginx配置:
limit_req_zone $binary_remote_addr zone=one:10m rate=3r/s;
server {
listen 80;
server_name xxx.xxx.xxx.xxx;
location / {
# 限制速率
limit_req zone=one;
root html;
index index.html index.htm;
}
}
1秒钟内启动10个请求,因为速率限制为3r/s,3个请求正常响应,7个请求返回503:
测试2. 限制同一IP每秒1个请求,瞬间最大请求量为5:
# 方便查看limit_req限制效果
log_format main '$time_local,$request,$status,limit_req_status=$limit_req_status';
access_log /usr/local/nginx/logs/access.log main;
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name xxx.xxx.xxx.xxx;
location /download/ {
alias /var/www/images/;
limit_req zone=one burst=5 nodelay;
}
}
本机同时启动15个请求ab -n 15 -c 15 http://127.0.0.1/download/1.jpg
,因为本机发起的请求能够第一时间到达nginx服务,客户端jmeter测试可能因网络原因有延迟。速率为1r/s,允许瞬间最大请求5(burst)无延迟处理,15个请求中6个处理成功,9个错误返回503,如下图: