概述一般暴露的系统在促销或黑客攻击时会收到大量的请求。为了保护系统不被瞬时高并发流量淹没,需要进行限流。通过查看nginx官方文档,小编看到了nginx限流的三种方式。1.limit_conn_zone2.limit_req_zone3.前两种ngx_http_upstream_module只能限制client的当前(也就是单个ip),文档也很齐全,但是测试后发现结果说官方文档中还是没有实现(可能是小编的测试方法有问题)。这里简单介绍一下前两个:limit_conn_zonenginx配置,其中“limit_connone10”可以放在server层对整个server有效,也可以放在location只对单个location有效。这个配置表示客户端的并发连接数只能是10,结果ab工具20并发请求nginx,可以看到Completerequests:20Failedrequests:9nginx配置中的ip为10,结果成功次数为+1的原因不明;nginx的日志也可以看到有9个请求返回503)limit_req_zonenginxconfigurationinwhich"limit_reqzone=req_oneburst=120”可以放在server层对整个server有效,也可以放在location只对单个location有效。rate=1r/s表示每个地址每秒只能请求一次,也就是说tokenbucketburst=120一共有120个token,每秒只增加1个新的token,120个token发送后,extrarequest会返回503..ngx_http_upstream_module简介作为一个优秀的负载均衡模块,是目前我工作中使用最多的。其实这个模块提供了我们需要的后端限流功能。根据官方文档,这个模块有一个参数:max_conns可以限制服务器的流量,可惜只能在nginx商业版中使用。不过在nginx1.11.5版本之后,官方已经把这个参数和商业版本分开了,也就是说只要我们升级生产中广泛使用的nginx1.9.12和1.10版本就可以使用了(通过测试,我们可以看到,在老版本的nginx中,如果加上这个参数,是无法启动nginx服务的)。配置结果(不便截图)用两台机器用ab工具分别向nginx发送20、30、40个并发请求:可以看到不管并发多少,成功的请求只有12个,成功的请求数会比2多,同时1.2的测试结果的成功数也是+1。这里有两台机器。基于这样的考虑,机器数量增加到三台,成功次数为13。这里是一个假设,请求成功的次数会根据客户端的+1+1(这里只是一个假设)注意:还有很重要的几点。max_conns是针对上游单台服务器的,不是全部;nginx有个参数:worker_processes,max_conns是针对每个worker_processes;
