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的限速模块

nginx 限速最容易理解的说明的更多相关文章

  1. Nginx限速模块初探

    Nginx限速模块分为哪几种?按请求速率限速的burst和nodelay参数是什么意思?漏桶算法和令牌桶算法究竟有什么不同?本文将带你一探究竟.我们会通过一些简单的示例展示Nginx限速模块是如何工作 ...

  2. Nginx Http框架的理解

    Nginx Http框架的理解 HTTP框架是Nginx基础框架的一部分,Nginx的其它底层框架如master-worker进程模型.event模块.mail 模块等. HTTP框架代码主要有2个模 ...

  3. Nginx (限速)限制并发、限制访问速率、限制流量

    Nginx 限制并发访问速率流量,配置还是简单的,看下Nginx文档根据文中这三个模块对照看一下就可以,Nginx限速使用的是漏桶算法(感兴趣可以看下文末的参考资料),需要注意的是:当需要进行限速操作 ...

  4. Nginx 限速模块一览

    为了保护服务器不被刷流量,或者业务方面的一些限制,需要做一些限速措施. 一.http 请求并发连接数模块:ngx_http_limit_conn_module 这个模块可以设置每个定义的变量(比如客户 ...

  5. Nginx限速遇到的问题

    公司使用的是Nginx做文件服务器,最近服务器流量增大,老板提出要给每个客户端进行限速. 在Nginx中进行限速配置: http { limit_zone one $binary_remote_add ...

  6. nginx配置之深入理解

    继上一篇<debian+nginx配置初探--php环境.反向代理和负载均衡>成功之后,有点小兴奋,终于不用整lvs那么复杂来搞定负载,但还是有很多概念没弄清楚. 什么是CGI.FastC ...

  7. nginx限速

    nginx 要实现限速,完整的实现是要限制客户端请求频率,并发连接和传输速度 1.请求限制 Nginx 请求限制的功能来自于 ngx_http_limit_req_module 模块.使用它需要首先在 ...

  8. NGINX 负载均衡的理解

    前言 NGINX是轻量级,也是当前比较流行的web服务器软件.体积小但是功能强大. 这里我按照自己的理解,记录下对NGINX负载均衡的认识.(加权均衡,最小连接) 这里参考了 [https://blo ...

  9. 关于nginx限速的配置

    limit_req zone=req_one burst=; zone定义了一个req_one的name,burst表示允许超过限制的请求数不多于20个,后面可加参数(nodelay):超过的请求不会 ...

随机推荐

  1. kubernetes 安装手册(成功版)

    管理组件采用staticPod或者daemonSet形式跑的,宿主机os能跑docker应该本篇教程能大多适用安装完成仅供学习和实验 本次安裝的版本: Kubernetes v1.10.0 (1.10 ...

  2. 普通Splay详解

    预备知识: 二叉搜索树(BST) 至于BST,随便看一下就可以, 我们知道二叉搜索树是O(logN)的,那我们为什么要用平衡树呢? 之前我们了解到,BST的插入是小的往左子树走,大的往右子树走,如果凉 ...

  3. Android多种方法显示当前日期和时间

    文章选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术.本文探讨Android显示当前日期和时间的方法. ...

  4. 【BZOJ4316】小C的独立集(仙人掌,动态规划)

    [BZOJ4316]小C的独立集(仙人掌,动态规划) 题面 BZOJ 题解 除了普通的动态规划以外,这题还可以用仙人掌的做法来做. 这里没有必要把圆方树给建立出来 \(Tarjan\)的本质其实就是一 ...

  5. 【CF1082F】Speed Dial(动态规划)

    [CF1082F]Speed Dial(动态规划) 题面 CF 洛谷 题解 把\(Trie\)树建出来之后发现就是一个树型\(dp\),每个点会对于其父亲中第一个被标记的点产生贡献. 那么把第一个点压 ...

  6. 【BZOJ5294】[BJOI2018]二进制(线段树)

    [BZOJ5294][BJOI2018]二进制(线段树) 题面 BZOJ 洛谷 题解 二进制串在模\(3\)意义下,每一位代表的余数显然是\(121212\)这样子交替出现的. 其实换种方法看,就是\ ...

  7. wcf 发布到iis后报错

    HTTP Error 404.3 - Not Found http://iweb.adefwebserver.com/Default.aspx?tabid=57&EntryID=34 未能从程 ...

  8. iptables(1)

    iptables配置文件:/etc/sysconfig/iptables 确认开启路由转发功能方法1:/sbin/sysctl -w net.ipv4.ip_forward=1方法2:echo 1 & ...

  9. CF1139D Steps to One(DP,莫比乌斯反演,质因数分解)

    stm这是div2的D题……我要对不住我这个紫名了…… 题目链接:CF原网  洛谷 题目大意:有个一开始为空的序列.每次操作会往序列最后加一个 $1$ 到 $m$ 的随机整数.当整个序列的 $\gcd ...

  10. 组件之间的数据传递--Vuex

    安装Vuex: npm install Vuex -S 在main.js中引入 import Vue from 'vue' import App from './App' import Vuex fr ...