« 上一篇下一篇 »

nginx限流的几种方法附代码

 

通过查看nginx官方文档,小弟查看到了三种nginx限流方法。

1、limit_conn_zone

2、limit_req_zone

3、ngx_http_upstream_module

前两种只能对客户端(即单一ip限流),并且文档也很全,可是通过检验发现,仍是无法到达官方文档所说的效果(可能小弟的检验方法有问题)。

这儿先简略的介绍一下前两种:

1、limit_conn_zone

1.1nginx配备

1
2
3
4
5
6
7
8
9
http{
limit_conn_zone $binary_remote_addr zone=one:10m;
server
{
......
limit_conn one 10;
......
}
}

其间“limit_conn one 10”既可以放在server层对整个server有用,也可以放在location中只对单独的location有用。
该配备标明:客户端的并发连接数只能是10个。

1.2效果

ab东西20并发去央求nginx,可以看到
Complete requests: 20
Failed requests: 9

(由于nginx配备中一个ip并发连接数为10,而效果中成功数为+1的原因不知道;nginx的日志中也可以看到有9个央求回来503)

2、limit_req_zone

2.1 nginx配备

1
2
3
4
5
6
7
8
9
http{
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
server
{
......
limit_req zone=req_one burst=120;
......
}
}

其间“limit_req zone=req_one burst=120”既可以放在server层对整个server有用,也可以放在location中只对单独的location有用。

rate=1r/s的意思是每个地址每秒只能央求一次,也就是说令牌桶burst=120一共有120块令牌,并且每秒钟只新增1块令牌,120块令牌发完后,多出来的央求就会回来503.。

3、ngx_http_upstream_module

3.1 介绍

作为优异的负载均衡模块,现在是我工作中用到最多的。其实,该模块是供应了我们需求的后端限流功用的。可是,在nginx1.11.5版别今后,官方现已将该参数从商业版中脱离出来了,也就是说只需我们将生产上广泛运用的nginx1.9.12版别和1.10版别晋级即可运用(通过检验可以看到,在旧版其他nginx中,假设加上该参数,nginx效力是无法发起的)。

3.2配备

1
2
3
4
5
6
7
upstream xxxx{
server 127.0.0.1:8080 max_conns=10;
server 127.0.0.1:8081 max_conns=10;
}

3.3效果(不方便截图)

用两台机器各自用ab东西向nginx发送20、30、40个并发央求:

可以看到不论并发多少,成功的央求只需12个,成功的次数会多个2个,一起1.2的检验效果中成功次数也是+1,这儿是两台机器,根据此种考虑,将机器添加至三台,公开成功的次数为13个。这儿得出一个想象,成功的央求数会根据客户端的+1而+1(这儿只是假定)

注:还有很重要的几点。max_conns是针对upstream中的单台server的,不是一切;nginx有个参数:worker_processes,max_conns是针对每个worker_processes的;

附ab东西设备进程(转载,来历不知道)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ab运转需求依托apr-util包,设备指令为:
yuminstallapr-util
#设备依托 yum-utils中的yumdownload 东西,假设没有找到 yumdownload 指令可以
yuminstallyum-utils
cd/opt
mkdirabtmp
cdabtmp
yuminstallyum-utils.noarch
yumdownloader httpd-tools*
rpm2cpio httpd-*.rpm | cpio -idmv
#操作完成后 将会发作一个 usr 目录 ab文件就在这个usr 目录中
#简略运用阐明
./ab-c 100 -n 10000 http://127.0.0.1/index.html
#-c 100 即:每次并发100个
#-n 10000 即: 共发送10000个央求 
 

照字面的了解,lit_req_zone的功用是经过 令牌桶原理来约束 用户的衔接频率,(这个模块答应你去约束单个地址 指定会话或特殊需要 的请求数 )
而 limit_zone 功用是约束一个客户端的并发衔接数。(这个模块可以约束单个地址 的指定会话 或许特殊情况的并发衔接数)
一个是约束并发衔接一个是约束衔接频率,表面上好像看不出来有什么区别,那就看看实践的效果吧~~~
在我的测验机上面加上这两个参数下面是我的部分配置文件