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 介绍
作为优秀的负载均衡模块,目前是我工作中用到最多的。其实,该模块是提供了我们需要的后端限流功能的。通过官方文档介绍,该模块有一个参数: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个请求 |
nginx限流方案的实现(三种方式)的更多相关文章
- Java基础知识强化之IO流笔记62:三种方式实现键盘录入
1. 三种方式实现键盘录入 System.in 标准输入流.是从键盘获取数据的 键盘录入数据三种方式: A:main方法的args接收参数. java HelloWorld hello w ...
- 死磕nginx系列--nginx 限流配置
限流算法 令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中: 令牌桶放满时,多余的令牌被丢弃: 请求要消耗等比例的令牌才能被处理: 令牌不够时,请求被缓存. 漏桶算法 算法思想是: 水( ...
- [转]Nginx限流配置
原文:https://www.cnblogs.com/biglittleant/p/8979915.html 作者:biglittleant 1. 限流算法 1.1 令牌桶算法 算法思想是: 令牌以固 ...
- Nginx限流
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 在当今流量徒增的互联网时代,很多业务场景都会涉及到高并发.这个时候接口进行限流是非常有必要的,而限流是Ngin ...
- Guava-RateLimiter实现令牌桶控制接口限流方案
一.前言 对于一个应用系统来说,我们有时会遇到极限并发的情况,即有一个TPS/QPS阀值,如果超了阀值可能会导致服务器崩溃宕机,因此我们最好进行过载保护,防止大量请求涌入击垮系统.对服务接口进行限流可 ...
- nginx限流模块(防范DDOS攻击)
Nginx限流模式(防范DDOS攻击) nginx中俩个限流模块: 1.ngx_http_limit_req_module(按请求速率限流) 2.ngx_http_limit_conn_module( ...
- Nginx限流办法
Nginx 限流 电商平台营销时候,经常会碰到的大流量问题,除了做流量分流处理,可能还要做用户黑白名单.信誉分析,进而根据用户ip信誉权重做相应的流量拦截.限制流量.Nginx自身有的请求限制模块ng ...
- 图解Nginx限流配置
本文以示例的形式,由浅入深讲解Nginx限流相关配置,是对简略的官方文档的积极补充. Nginx限流使用的是leaky bucket算法,如对算法感兴趣,可移步维基百科先行阅读.不过不了解此算法,不影 ...
- 应答流式RPC 请求流式RPC 向流式RPC 流式RPC的三种具体形式
https://mp.weixin.qq.com/s/pWwSfXl71GQZ3KPmAHE_dA 用Python进行gRPC接口测试(二) 大帆船 搜狗测试 2020-02-07 上期回顾:用P ...
随机推荐
- [ Educational Codeforces Round 65 (Rated for Div. 2)][二分]
https://codeforc.es/contest/1167/problem/E E. Range Deleting time limit per test 2 seconds memory li ...
- Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A,B,C【真的菜·】
8说了 #include<bits/stdc++.h> using namespace std; #define int long long signed main(){ string s ...
- 008——转载——c#获取当前日期时间
(一)转载——c#获取当前日期时间 我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日 ...
- MVC4 Application Install
For VS2010 http://www.asp.net/mvc/mvc4 For VS2012 http://www.asp.net/downloads
- learning scala dependency injection
println("Step 1: Create a trait which knows how to do create, read, update and delete operation ...
- 对象(面向对象、创建对象方式、Json)
一.面向对象 面向过程:凡事亲力亲为,每件事的具体过程都要知道,注重过程 面向对象:根据需求寻找对象,所有的事都用对象来做,注重结果 面向对象特性:封装.继承.多态(抽象性) js是一门基于对象的语言 ...
- AdvanceEast源码理解
目录 文章思路 源码理解 一. 标签点形式 按顺序排列四个点,逆时针旋转,且第一个点为左上角点(刚开始选择最左边的点, 二. 标签切边 三. loss计算 四. NMS 最后说明 文章思路 大神的gi ...
- wepy项目的学习
使用Promise 开发实时编译 wepy build --watch 安装依赖 cd myproject npm install 安装(更新) wepy 命令行工具. npm install wep ...
- webpack4温习总结
webpack是一个模块打包器,可以根据入口文件,随着依赖关系将所有文件打包成js文件. 首先需要node环境,百度一下自己安装 webpack官网地址:https://www.webpackjs.c ...
- Arrays.binarySearch采坑记录及用法
今天在生产环境联调的时候,发现一个很奇怪的问题,明明测试数据正确,结果却是结果不通过,经过debug查询到原来是Arrays.binarySearch用法错误,记录一下,避免后续再次犯错 具体测试如下 ...