可能是 nginx 限速最容易理解的说明

news/2024/7/1 3:16:51

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 下载情况:
      google 下载情况
    • 360 下载情况:
      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的限速模块


http://lihuaxi.xjx100.cn/news/240863.html

相关文章

二分法典例:木棒切割问题

Input : 输入木棒根数n,要得到的等长木棒数量K,以及n根木棒的长度。 Output : 等长木棒的最大长度。 用二分法求解这道题,首先要找到以得到的等长木棒数量为因变量、等长木棒长度为自变量函数。 int getK(int l){//随着l增大,返…

1044 Shopping in Mars

这题我写了两个二分函数。 BS借用的模板是找到第一个大于等于总价的商品下标,然后返回的是钻石价值和减去商品总价,通过遍历来得到最小的差值,注意遍历的最后一个数字的时候可能会返回负值,所以只有当返回值大于等于0才可以用来竞…

利用Redis进行全页面缓存的简单Demo

2019独角兽企业重金招聘Python工程师标准>>> 使用Redis进行全页面缓存,如何实现呢?本文使用简单的思路来实现这个功能。 一、环境介绍 使用的开源框架主要是springmvc、spring-data-redis、redis开发工具:Intellij IDEA 2017.2.4j…

Java动态代理机制

在Java的动态代理机制中,有两个重要的类。一个是InvocationHandler,另一个是Proxy。InvocationHandler:每一个动态代理类都必须要实现InvocationHandler接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理…

1048 Find Coins(二分法解法)

非常基础的二分法-寻找序列中是否存在某一条件的元素 的应用 AC代码 #include<cstdio> #include<iostream> #include<set> #include<vector> #include<map> #include<algorithm>using namespace std;const int SUP 100000000; const in…

数据库抽取,生成CSV文件导出,CSVUtils工具类

2019独角兽企业重金招聘Python工程师标准>>> 开发背景&#xff1a; 最近一直在忙一个任务调度系统&#xff0c;需求一直没定下来&#xff0c;需求一直变更&#xff0c;调度一直改&#xff0c;往往复复。。。 等这波忙完了可以写一下关于BI这边调度任务的相关问题&am…

数组、字符串对象、Math对象

数组的介绍 数组介绍 概念&#xff1a; 就是将若干个数据以一定的顺序放在一起的一个集合体&#xff0c;整体上就称之为“数组”。数组就是一列数据的有序排列的集合。定义形式&#xff1a; var arr1 new Array(1, 5, 8, 7, 2, 10); //定义了一个数组&#xff0c;其中具有6个数…

1126 Eulerian Path

主要考英语或者数学基础。 一幅连通图的奇点个数为0或2时才能够被一笔画。 连通图的判断用DFS来计数。 连通图0个奇点&#xff1a;Eulerian 连通图2个奇点&#xff1a;semi-Eulerian 非连通图/连通图其他数量的奇点&#xff1a;non-Eulerian AC代码 #include<cstdio&…