nginx 限速最容易理解的說明
阿新 • • 發佈:2019-01-07
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。
- google 下載情況:
-
如何控制這兩個量(單個連線數的下載速度, 連線數)
- 在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的限速模組