Nginx与LUA(3)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
您好我是湘王这是我的CSDN博客欢迎您来欢迎您再来~
在互联网应用中很多场景都会涉及到高并发请求如果不对这些请求做限制那么服务器很快就会被挤垮。就像在12306买票一样如果全国人民都去抢票服务器是无论如何也扛不住压力的。
这是非常现实的而且也是必须要解决的问题。
其实除了反向代理和负载均衡网络限流也是Nginx的拿手好戏。
常用于实现网络限流的两类算法有
1、令牌桶
2、漏桶。
而Nginx实现限流的两种方式是
1、限制访问频率就是限制指定时间内每个用户的访问次数
2、限制并发连接数就是限制某段时间内访问资源的用户数。
Nginx限流模块使用的是漏桶算法。
令牌桶限流的算法思想是
1、令牌以固定速率产生并缓存到令牌桶
2、令牌桶放满时多余的令牌将被直接丢弃
3、请求进来时先进入待处理的请求队列
4、处理请求时需要从桶里拿到相应数量的令牌作为处理「凭证」
5、当桶里没有令牌时请求处理被拒绝。
令牌桶是一种常用于网络流量整形和速率限制的算法只有持有令牌的请求才会被处理这也是令牌桶名称的由来。令牌桶算法允许突发流量的存在更适合会有突发流量的场景。
而漏桶限流的算法思想是
水请求从上方进入水桶从下方流出被处理来不及流出的水存在水桶中缓冲以固定速率流出。水桶满后水溢出丢弃请求。漏桶也是一种常用的整形和限速算法其核心是缓存请求、匀速处理、多余丢弃。
正如漏桶一样不管突然增加多少水量底部的漏洞始终保持着匀速的出水量这正是漏桶算法名称的由来。因此漏桶算法会屏蔽突发请求更适合需要平滑流量的场景。
漏桶算法与令牌桶算法看起来很类似容易弄混。实际上这两者具有截然不同的特性应用在不同的场景中。真正区分令牌桶和漏桶最核心的特征是「变速」和「匀速」
1、令牌桶是一种变速运动——就像高速上的汽车一样
2、漏桶是一种匀速运动——就像铁轨上的火车一样。
这两种限流算法没有优劣好坏之分只区分场景的适用性。
为了验证这两种县里算法可以做一个简单的测试。ab是apachebench命令的缩写是一款比较优秀的压测工具。在安装Nginx的机器上安装ab如果不想安装apache但是又想使用ab命令的话可以这样做
yum -y install httpd-tools
cd /usr/bin
ab -V
ab的使用也很简单
./ab -h获取帮助
./ab -n1000 -c100 -t1 -s5 http://localhost/test?username=test1
意思是发送1000次每次100个并发请求到指定服务并在1秒之内完成请求超时时间5秒。如果只是-n100、-c10参数只能看到总的请求次数100次看不到并发请求环境下是否真的满足限流要求。
如果加上-t、-s参数就能很清楚地看到限流效果。
ab测试完成后的结果可能是这个样子的
用Nginx限制访问速率可以这样写限制每个IP的访问速率为每秒10次。
limit_req_zone $binary_remote_addr zone=case1:10m rate=10r/s;
server {
listen 80;
server_name localhost;
location / {
limit_req zone=case1;
}
}
ab测试命令
./ab -n100 -c10 -t1 -s5 http://localhost/test?username=test1
./ab -n100 -c10 -t2 -s5 http://localhost/test?username=test1多线程影响
结果满足要求
Complete requests30397Failed requests30387
用Nginx限制突发增量可以这样写限制每个IP的访问速率为每秒10次有burst且直接返回。
limit_req_zone $binary_remote_addr zone=case1:10m rate=10r/s;
server {
listen 80;
server_name localhost;
location / {
limit_req zone=case1 burst=5 nodelay;
}
}
ab测试命令
./ab -n100 -c10 -t1 -s5 http://localhost/test?username=test1
./ab -n100 -c10 -t2 -s5 http://localhost/test?username=test1多线程影响
结果观察
Complete requests15212Failed requests15197
用Nginx限制并发访问限制每个IP的并发请求为10。
limit_conn_zone $binary_remote_addr zone=case2:10m;
server {
listen 80;
server_name localhost;
location / {
limit_conn case2 10;
}
}
ab测试命令
./ab -n100 -c10 -t1 -s5 http://localhost/test?username=test1
./ab -n100 -c11 -t1 -s5 http://localhost/test?username=test1
结果观察
当参数为c10所有请求全部成功当参数为c11出现请求失败的情况
限制并发访问按服务名。
限制每个服务的并发请求为10
limit_conn_zone $server_name zone=case3:10m;
server {
listen 80;
server_name localhost;
location / {
limit_conn case3 10;
}
}
ab测试命令
./ab -n100 -c10 -t1 -s5 http://localhost/test?username=test1
./ab -n100 -c11 -t1 -s5 http://localhost/test?username=test1
结果观察
当参数为c10所有请求全部成功当参数为c11出现请求失败的情况
还可以自定义返回值配置status返回值
limit_req_zone $binary_remote_addr zone=case1:10m rate=10r/s;
server {
listen 80;
server_name localhost;
location / {
limit_conn case1 10;
limit_req_status 599;
}
}
ab测试命令
./ab -n100 -c10 -t1 -s5 http://localhost/test?username=test1
ab看不到效果需要用其他更专业测试工具比如Postman。
感谢您的大驾光临咨询技术、产品、运营和管理相关问题请关注后留言。欢迎骚扰不胜荣幸~