此篇介绍一下Nginx的限流功能。
Nginx限流方式
- 限制访问频率
- 限制并发连接数
一、限制访问频率
1. 正常流量限制访问频率
在nginx.conf配置文件中可以使用limit_req_zone命令及limit_req命令限制单个IP的请求处理频率。
limit_req_zone key zone rate
key: 定义需要限流的对象
zone: 定义共享内存区来存储访问信息
rate: 用于设置最大访问速率
示例如:
http {
limit_req_zone $binary_remote_addr zone=myLimit:10m rate=3r/s;
}
server {
location / {
limit_req zone=myLimit;
rewrite / http://www.test.com permanent;
}
}
2. 突发流量限制访问频率
上面的配置在一定程度上可以限制访问频率,但是也存在着一个问题:如果突发流量超出请求被拒绝处理,无法处理活动高峰时的突发流量,这时候应该如何处理呢?Nginx提供了burst参数结合nodelay参数可以解决流量突发的问题,即设置在超过请求数外能额外处理的请求数。示例如:
http {
limit_req_zone $binary_remote_addr zone=myLimit:10m rate=3r/s;
}
server {
location / {
limit_req zone=myLimit burst=5 nodelay;
rewrite / http://www.test.com permanent;
}
}
可以看到上面添加了burst=5 nodelay。
如果没有添加nodelay参数,则可以理解为预先在内存中占用了5个请求的位置,如果有5个突发请求就会按照200ms/个去依次处理请求,也就是1s内把5个请求全部处理完毕。如果1s内有新的请求到达也不会立即进行处理,因为紧急程度更低。这样实际上就会将额外的5个突发请求以200ms/个去依次处理,保证了处理速率的稳定,所以在处理突发流量的时候也一样可以正常处理。
如果添加了nodelay参数则表示要立即处理这5个突发请求。
二、限制并发连接数
Nginx中的ngx_http_limit_conn_module模块提供了限制并发连接数的功能,可以使用limit_conn_zone指令以及limit_conn执行进行配置。接下来我们可以通过一个简单的例子来看下:
http {
limit_conn_zone $binary_remote_addr zone=myip:10m;
limit_conn_zone $server_name zone=myServerName:10m;
}
server {
location / {
limit_conn myip 10;
limit_conn myServerName 100;
rewrite / http://www.test.com permanent;
}
}
上面配置了单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接。当然,只有当请求的header被服务器处理后,虚拟服务器的连接数才会计数。
Nginx是基于漏桶算法原理实现的,实际上限流一般都是基于漏桶算法和令牌桶算法实现的。接下来我们来看看关于这两个算法的介绍:
三、令牌桶算法
令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limit)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。
令牌桶算法的机制如下:存在一个大小固定的令牌桶,会以恒定的速率源源不断产生令牌。如果令牌消耗速率小于生产令牌的速度,令牌就会一直产生直至装满整个令牌桶。
四、漏桶算法
漏桶(Leaky Bucket)算法也是网络世界中流量整形或速率限制时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。
漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。突发流量会进入到一个漏桶,漏桶会按照我们定义的速率依次处理请求,如果水流过大也就是突发流量过大就会直接溢出,即多余的请求会被拒绝,所以漏桶算法能控制数据的传输速率。
令牌桶算法与漏桶算法的区别:两种算法都能够限制数据传输速率,但令牌桶还允许某种程度的突发传输。因为令牌桶算法只要令牌桶中存在令牌,就可以突发的传输对应的数据到目的地,所以更适合流量突发的情形下进行使用。
1. 漏桶是出,令牌是进
2. 令牌是允许伸缩的