nginx限制处理窗口数量,进而限制请求的并发量和限速(ab压测测试)
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
http {
...
limit_req_zone $binary_remote_addr zone=aming1:10m rate=1r/s; #添加,请求时候会限速,一秒处理一个
...
include vhost/*.conf; #添加
}
[root@localhost ~]# cat /usr/local/nginx/conf/vhost/www.1.conf
server{
listen 80;
server_name www.1.com;
root /data/wwwroot/www.1.com;
index index.html;
limit_req zone=aming1 burst=5;
#burst=5相当于,银行开放5个窗口,同时能处理5个, rate=1r/s相当于每个窗口的业务员处理能力,1秒处理1个request请求
}
[root@localhost ~]# cat /etc/hosts
192.168.171.132 www.1.com
[root@localhost ~]# > /usr/local/nginx/logs/access.log
[root@localhost ~]# ab -n 10 -c 10 -I http://www.1.com/ #ab压力并发测试,-n总请求数, -c并发数 注意:因为设置了限速,所以请求后,会持续一段时间(1秒处理一个)
查看日志查看并发处理数:因为设置了只开放5个窗口,相当于只能并发5个,当实际过来的并发是10个的时候,会只能处理5个,剩下5个则需要排队,在同一时间没法进行处理503错误。
[root@localhost ~]# cat /usr/local/nginx/logs/access.log #查看日志,有6个200的是能处理的,4个503是不能处理的,因为第一个请求过来就处理了,后面才开始排队
192.168.171.132 - - [26/Dec/2020:11:11:08 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:11:08 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:11:08 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:11:08 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:11:08 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:11:09 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:11:10 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:11:11 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:11:12 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:11:13 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
调高burst的窗口数量,同样并发10个时候,则一次就能处理完:
[root@localhost ~]# cat /usr/local/nginx/conf/vhost/www.1.conf
server{
listen 80;
server_name www.1.com;
root /data/wwwroot/www.1.com;
index index.html;
limit_req zone=aming1 burst=100;
#burst=100相当于,银行开放100个窗口,同时能处理100个, rate=1r/s相当于每个窗口的业务员处理能力,1秒处理1个request请求
}
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
[root@localhost ~]# > /usr/local/nginx/logs/access.log
[root@localhost ~]# ab -n 10 -c 10 -I http://www.1.com/ #ab压力并发测试,-n总请求数, -c并发数,注意:因为设置了限速,所以请求后,会持续一段时间(1秒处理一个)
查看日志查看并发处理数:因为设置提高是并发窗口数量,一次能处理100个,当并发是10个时候,肯定就直接都能被处理,不会有503错误。
[root@localhost ~]# cat /usr/local/nginx/logs/access.log
192.168.171.132 - - [26/Dec/2020:11:17:48 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:17:49 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:17:50 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:17:51 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:17:52 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:17:53 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:17:54 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:17:55 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:17:56 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
192.168.171.132 - - [26/Dec/2020:11:17:57 +0800] "GET / HTTP/1.0" 200 6 "-" "ApacheBench/2.3"
注意:
limit_req_zone: 语法: limit_req_zone $variable zone=name:size rate=rate;
设置一块共享内存限制域用来保存键值的状态参数。 特别是保存了当前超出请求的数量。
键的值就是指定的变量(空值不会被计算)。
如limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
说明:区域名称为one,大小为10m,平均处理的请求频率不能超过每秒一次,键值是客户端IP。
使用$binary_remote_addr变量, 可以将每条状态记录的大小减少到64个字节,这样1M的内存可以保存大约1万6千个64字节的记录。
如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503 (Service Temporarily Unavailable)错误。
速度可以设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,
所以如果你需要指定每秒处理少于1个的请求,2秒处理一个请求,可以使用 “30r/m”。
limit_req: 这个阈值的默认值为0。如:
limit_req_zone $binary_remote_addr zone=aming:10m rate=1r/s;
server {
location /upload/ {
limit_req zone=aming burst=5;
}
}
限制平均每秒不超过一个请求,同时允许超过频率限制的请求数不多于5个。
如果不想限速,在burst后面添加参数: nodelay; 如: limit_req zone=aming burst=5 nodelay;
安装ab命令: # yum -y install httpd-tools #即可安装ab命令