当前位置: 首页 > 后端技术 > PHP

可能是对nginx限速最通俗易懂的描述

时间:2023-03-30 01:48:21 PHP

nginx限速研究报告写在前面这两天服务器带宽爆炸,情况如下:为了减少带宽峰值速度。以下是我在研究过程中的体会!(写了人生第一篇技术网文章花了好几个小时)限速方案:声明:连接数:单个ip的请求数nginx限速的实现原理: 通过控制下载单个连接的带宽和控制连接数的实现。先限制单个连接的带宽,再限制连接数。如果要实现限速,需要限制单个连接的带宽,但没有必要限制连接数。在实际情况下,我们可能不会限制连接数,因为单个IP会有大量的连接数。比如:公司用的是专线,公司里大家用的是同一个IP。如果你限制连接数为5个,下载器默认5个连接,那么只能一个人下载,其他人可以访问。就是503,很多时候我们是不允许限制连接数的,所以只能限制单个连接的带宽。限制单个连接的带宽时要小心。有些下载器使用单链接,你不能把单连接的带宽限制得太小。例如nginx限速配置如下:http{limit_conn_zone$binary_remote_addrzone=addr:10m;#实例化nginx对象(哈哈,你是这么理解的)server{listen80;服务器名称xx.com;access_logxx.logmain;错误日志xx.log;根xx;索引index.html;limit_connperip5;#调用nginx对象属性并赋值limit_rate20k;#调用nginx对象属性并赋值#以上两个限制的意思是:单个IP最多允许5个连接,单个连接带宽为20K,如果下载器一次可以发起5个请求(5个连接),那么此下载器的最大下载速度为100K;:对比发现,浏览器自带的下载器可以限制nginx限速,只有下载软件(如:迅雷)不限速。(毕竟,人们靠这个吃饭)。当然,你也可以连续开启多个下载任务,测试连接数限制。如果设置连接数为5,则浏览器最多可以打开5个下载,下载软件(如:迅雷)可能只打开一个。下载任务(因为他会开很多连接,已经超过你设置的5个连接)。如果超过了,下面我们说的连接数限制中的两种方法返回的结果略有不同:方法一,超出的请求会被放入突发队列。队列的长度取决于你设置的突发值,一个一个处理,超过队列长度返回503。方法二、直接返回503。如何控制这两个量(单个连接数的下载速度,连接数)就像在http中实例化一个nginx对象,并给nginx对象赋初值。服务器中的配置就像调用这个nginx类属性(个人理解)连接数控制第一种方法:先在http下添加:limit_req_zone$binary_remote_addrzone=one:10mrate=1r/s;然后在服务器中添加:limit_reqzone=oneburst=5nodelay;示例1http{limit_req_zone$binary_remote_addrzone=one:10mrate=1r/s;...server{...location/download/{limit_reqzone=oneburst=5nodelay;#nodelay的大概意思是告诉nginx超过Connectionslimitedby**rate**直接返回503,不用等待处理#这句话的意思是每秒处理1个请求,最多有5个pendingrequests在队列中,多余的请求直接返回503(个人理解)}}}第二种方式:先在http:limit_conn_zone$binary_remote_addrzone=addr:10m;然后在服务器中添加:limit_connaddr1;示例2http{limit_conn_zone$binary_remote_addrzone=addr:10m;...服务器{...位置/下载/{limit_conn地址1;#通过这个限制链接数}}}单个连接的下载带宽控制:首先在http:limit_conn_zone$binary_remote_addrzone=addr:10m;然后在服务器中添加:limit_rate100K;示例http{limit_conn_zone$binary_remote_addrzone=addr:10m;...服务器{...位置/下载/{limit_rate100k;#通过这个来限制单个连接的带宽}}}OK,我们知道了nginx限速的原理,学会配置这两个配置项,我也给出了测试效果的效果图,我们去总结一下:要实现限速,前面说过,单连接带宽限制是必须的。在生产环境中,建议不要使用连接数来限制单个连接的带宽限制。像迅雷这样的下载器限速不容易太低,可能需要其他方法