這兩天服務器帶寬爆了,狀況以下圖:
html
出於下降帶寬峯值的緣由,我開始各類瘋狂的研究nginx限速。下面是我研究過程當中的心得!(花了好幾個小時的時間寫的人生第一篇技術類網文)node
聲明:nginx
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; } }
限速效果圖:服務器
對比發現:nginx限速對瀏覽器自帶的下載器來講,均可以限制,可是惟獨下載軟件(如:迅雷)不受限制。(畢竟人家就是靠這個吃飯的)。固然你也能夠連開多個下載任務,測試一下鏈接數限制,若是你設置了鏈接數爲5,你能夠最多在瀏覽器打開5個下載,下載軟件(如:迅雷)中可能只能打開一個下載任務(由於他會打開不少鏈接,已經超過了你設置的5個鏈接數)。若是超過的話,下面咱們說的鏈接數限制中的兩個方法返回的結果略有不一樣:測試
方法1. 會將超出的請求放入burst隊列中,隊列的長度取決於你設置的burst值,一個一個處理,超過隊列長度的返回503。 方法2. 直接返回503。
如何控制這兩個量(單個鏈接數的下載速度, 鏈接數)google
鏈接數控制
第一種方式:
首先在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的限速模塊