摘要:在生产环境中,建议不要使用连接数限制单个连接的带宽限制不易过低像迅雷这种下载器的限速,可能需要别的办法注文中部分内容参考自关于的限速模块
nginx 限速研究汇报 写在前面
这两天服务器带宽爆了,情况如下图:
出于降低带宽峰值的原因,我开始各种疯狂的研究nginx限速。下面是我研究过程中的心得!(花了好几个小时的时间写的人生第一篇技术类网文)
限速的方案:
声明:
连接数:单个ip的请求数
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; } }
限速效果图:
google 下载情况:
360 下载情况:
迅雷下载情况:
对比发现:nginx限速对浏览器自带的下载器来说,都可以限制,但是唯独下载软件(如:迅雷)不受限制。(毕竟人家就是靠这个吃饭的)。当然你也可以连开多个下载任务,测试一下连接数限制,如果你设置了连接数为5,你可以最多在浏览器打开5个下载,下载软件(如:迅雷)中可能只能打开一个下载任务(因为他会打开很多连接,已经超过了你设置的5个连接数)。如果超过的话,下面我们说的连接数限制中的两个方法返回的结果略有不同:
方法1. 会将超出的请求放入burst队列中,队列的长度取决于你设置的burst值,一个一个处理,超过队列长度的返回503。 方法2. 直接返回503。
如何控制这两个量(单个连接数的下载速度, 连接数)
在http中添加的都像是实例化一个nginx对象,并给nginx对象赋初值,在server中的配置就像是调用这个nginx类的属性(个人理解)
连接数控制
第一种方式:
首先在http下添加:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
然后在server中添加:
limit_req zone=one burst=5 nodelay;
示例一
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的限速模块
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/25844.html
摘要:在生产环境中,建议不要使用连接数限制单个连接的带宽限制不易过低像迅雷这种下载器的限速,可能需要别的办法注文中部分内容参考自关于的限速模块 nginx 限速研究汇报 写在前面 这两天服务器带宽爆了,情况如下图:showImg(https://segmentfault.com/img/bVUXj3?w=1884&h=352); 出于降低带宽峰值的原因,我开始各种疯狂的研究ng...
摘要:但是,你的连接数限制配置为允许单个连接数,单个连接数最大带宽为。就降低单个连接数带宽吧要知道大家谁没事会用浏览器自带下载器下载呢注本文只探讨限速模块在不同业务下的限速彩蛋偶尔发现,将连接数限制为迅雷不能高速下载了。 nginx 内置模块限速怎么使用就不多说了,今天来说说连接数和单个连接数限速的事。 场景:A公司有100人,A公司只有一个公网IP,假设A公司可能有100个人同时在下载你的...
摘要:但是,你的连接数限制配置为允许单个连接数,单个连接数最大带宽为。就降低单个连接数带宽吧要知道大家谁没事会用浏览器自带下载器下载呢注本文只探讨限速模块在不同业务下的限速彩蛋偶尔发现,将连接数限制为迅雷不能高速下载了。 nginx 内置模块限速怎么使用就不多说了,今天来说说连接数和单个连接数限速的事。 场景:A公司有100人,A公司只有一个公网IP,假设A公司可能有100个人同时在下载你的...
摘要:作为一组独立的微服务之一被实现并作为一个单独的进行发布。该配置将暴露所有由网关发布的,入口位于,用协议加密保护。由网关发布的所有的所有后端服务均在中被定义。与浏览器不同,网关并不能向客户端发送带有新的命名的重定向。 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自云+社区翻译社,作者ArrayZoneYour Nginx往往是构建微服务中必不可缺的一部分,从本文中...
阅读 3793·2023-04-25 16:32
阅读 2194·2021-09-28 09:36
阅读 2033·2021-09-06 15:02
阅读 672·2021-09-02 15:21
阅读 918·2019-08-30 15:56
阅读 3512·2019-08-30 15:45
阅读 1708·2019-08-30 13:09
阅读 379·2019-08-29 16:05