通过查看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 功用是约束一个客户端的并发衔接数。(这个模块可以约束单个地址 的指定会话 或许特殊情况的并发衔接数)
一个是约束并发衔接一个是约束衔接频率,表面上好像看不出来有什么区别,那就看看实践的效果吧~~~
在我的测验机上面加上这两个参数下面是我的部分配置文件