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

nginx 限速研究汇报

写在前面

       这两天服务器带宽爆了,状况以下图:
带宽状况图html

出于下降带宽峰值的缘由,我开始各类疯狂的研究nginx限速。下面是我研究过程当中的心得!(花了好几个小时的时间写的人生第一篇技术类网文)node

限速的方案:

  • 声明: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。
  • 如何控制这两个量(单个链接数的下载速度链接数)google

    • 在http中添加的都像是实例化一个nginx对象,并给nginx对象赋初值,在server中的配置就像是调用这个nginx类的属性(我的理解)
    • 链接数控制
      第一种方式:
      首先在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的限速模块

相关文章
相关标签/搜索