这两天服务器带宽爆了,状况以下图:html
出于下降带宽峰值的缘由,我开始各类疯狂的研究nginx限速。下面是我研究过程当中的心得!(花了好几个小时的时间写的人生第一篇技术类网文)node
声明:nginx
nginx限速的实现原理:
经过控制单个链接的下载带宽和控制链接数来实现。
首先限制单个链接的带宽,而后限制链接数。若是要实现限速,限制单个链接带宽是必须的,限制链接数是非必须的。
在实际状况中,咱们可能出于单个IP会存在大量链接数的状况而不去限制链接数。
好比:公司用的是专线,全公司的人用的是同一个IP,若是你限制链接数为5,下载器默认链接数为5,那么就只能供一我的下载,而别的人访问都是503。还有不少状况,都不容许咱们去限制链接数,因此,咱们只能限制单个链接的带宽。
在限制单个链接带宽时要注意,有一些下载器使用的是单连接,你不能将单个链接的带宽限制的过小。
好比nginx限速配置以下:浏览器
http { limit_conn_zone $binary_remote_addr zone=addr:10m; #实例化nginx对象(哈哈,这样理解美滋滋) server { listen 80; server_name xx.com; access_log xx.log main; error_log xx.log; root xx; index index.html; limit_conn perip 5; #调用nginx对象属性并赋值 limit_rate 20k; #调用nginx对象属性并赋值 #上面这两个limit的意思是:单个IP最大容许5个链接,单个链接带宽为20K,若下载器一次能够发起5个请求(5个链接数),那么这个下载器最大下载速度为100K; } }
限速效果图:服务器
对比发现:nginx限速对浏览器自带的下载器来讲,均可以限制,可是惟独下载软件(如:迅雷)不受限制。(毕竟人家就是靠这个吃饭的)。固然你也能够连开多个下载任务,测试一下链接数限制,若是你设置了链接数为5,你能够最多在浏览器打开5个下载,下载软件(如:迅雷)中可能只能打开一个下载任务(由于他会打开不少链接,已经超过了你设置的5个链接数)。若是超过的话,下面咱们说的链接数限制中的两个方法返回的结果略有不一样:测试
方法1. 会将超出的请求放入burst队列中,队列的长度取决于你设置的burst值,一个一个处理,超过队列长度的返回503。 方法2. 直接返回503。
如何控制这两个量(单个链接数的下载速度, 链接数)google
链接数控制
第一种方式:
首先在http下添加:spa
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
而后在server中添加:code
limit_req zone=one burst=5 nodelay;
示例一server
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ... server { ... location /download/ { limit_req zone=one burst=5 nodelay; #nodelay 的大概意思是告诉nginx将超出**rate**限制的链接直接返回503,不须要等待处理 #这句话的意思就是说,每秒处理1个请求,队列中最多有5个待处理请求,多余请求直接返回503(我的理解) } } }
第二种方式:
首先在http中添加:
limit_conn_zone $binary_remote_addr zone=addr:10m;
而后在server中添加:
limit_conn addr 1;
示例二
http { limit_conn_zone $binary_remote_addr zone=addr:10m; ... server { ... location /download/ { limit_conn addr 1; #经过这个限制连接数 } } }
单个链接数的下载带宽控制:
首先在http中添加:
limit_conn_zone $binary_remote_addr zone=addr:10m;
而后在server中添加:
limit_rate 100K;
示例
http { limit_conn_zone $binary_remote_addr zone=addr:10m; ... server { ... location /download/ { limit_rate 100k; #经过这个限制单个链接数的带宽 } } }
OK,咱们知道了nginx限速原理,并学会配置这两个配置项,测试效果我也已经给出了效果图,下面咱们来总结一下:
注:文中部份内容参考自 关于nginx的限速模块