多是 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的限速模塊

相關文章
相關標籤/搜索