通过查看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 介绍

作为优秀的负载均衡模块,目前是我工作中用到最多的。其实,该模块是提供了我们需要的后端限流功能的。通过官方文档介绍,该模块有一个参数:max_conns可以对服务端进行限流,可惜在商业版nginx中才能使用。然而,在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包,安装命令为:
yum install apr-util
#安装依赖 yum-utils中的yumdownload 工具,如果没有找到 yumdownload 命令可以
yum install yum-utils
cd /opt
mkdir abtmp
cd abtmp
yum install yum-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个请求

最新文章

  1. jsonp的使用
  2. 【转载】Spark性能优化指南——高级篇
  3. [转]backbone.js 示例 todos
  4. Mahout 的安装
  5. 【循序渐进学Python】9.异常处理
  6. Java-->PrintStream
  7. JS 阻止浏览器默认行为和冒泡事件
  8. android SDK 更新
  9. ajax 用xml传递数据
  10. Android Studio创建工程时一直卡在下载Gradle
  11. Lintcode389 Valid Sudoku solution 题解
  12. 浅析Django之session与cookie
  13. James Munkres Topology: Sec 22 Exer 6
  14. STS中logback.xml配置文件
  15. java fail-fast和fail-safe
  16. hdpi对应分辨率
  17. HDU 1711Number Sequence【KMP模板题】
  18. AVL平衡二叉树的各种问题(Balanced Binary Tree)
  19. SpringBoot2.0.2 不使用parent作为maven单继承方式操作 : org.springframework.boot : spring-boot-dependencies : 2.0.2.RELEASE
  20. letcode code]Maximum Subarray

热门文章

  1. python - django (查询、聚合、分组)
  2. 61、springmvc-异步请求-返回DeferredResult
  3. 通过n+1个控制点求出n段分段函数的解析式
  4. 树状数组例题-数星星,简单题easy,校门外的树2,清点人数
  5. 51nod P1354 选数字 题解
  6. Mina入门级客户端程序实现telnet程序
  7. 第一章 初识Linux shell
  8. Gluon学习02-使用GPU
  9. EasyUEFI---EFI/UEFI boot option management
  10. Codeforces Round #563 (Div. 2)/CF1174