1. 程式人生 > >nginx 限速最容易理解的說明

nginx 限速最容易理解的說明

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