摘要:在生產環境中,建議不要使用連接數限制單個連接的帶寬限制不易過低像迅雷這種下載器的限速,可能需要別的辦法注文中部分內容參考自關于的限速模塊
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的限速模塊
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40573.html
摘要:在生產環境中,建議不要使用連接數限制單個連接的帶寬限制不易過低像迅雷這種下載器的限速,可能需要別的辦法注文中部分內容參考自關于的限速模塊 nginx 限速研究匯報 寫在前面 ? ? ? ?這兩天服務器帶寬爆了,情況如下圖:showImg(https://segmentfault.com/img/bVUXj3?w=1884&h=352); 出于降低帶寬峰值的原因,我開始各種瘋狂的研究ng...
摘要:但是,你的連接數限制配置為允許單個連接數,單個連接數最大帶寬為。就降低單個連接數帶寬吧要知道大家誰沒事會用瀏覽器自帶下載器下載呢注本文只探討限速模塊在不同業務下的限速彩蛋偶爾發現,將連接數限制為迅雷不能高速下載了。 nginx 內置模塊限速怎么使用就不多說了,今天來說說連接數和單個連接數限速的事。 場景:A公司有100人,A公司只有一個公網IP,假設A公司可能有100個人同時在下載你的...
摘要:但是,你的連接數限制配置為允許單個連接數,單個連接數最大帶寬為。就降低單個連接數帶寬吧要知道大家誰沒事會用瀏覽器自帶下載器下載呢注本文只探討限速模塊在不同業務下的限速彩蛋偶爾發現,將連接數限制為迅雷不能高速下載了。 nginx 內置模塊限速怎么使用就不多說了,今天來說說連接數和單個連接數限速的事。 場景:A公司有100人,A公司只有一個公網IP,假設A公司可能有100個人同時在下載你的...
摘要:作為一組獨立的微服務之一被實現并作為一個單獨的進行發布。該配置將暴露所有由網關發布的,入口位于,用協議加密保護。由網關發布的所有的所有后端服務均在中被定義。與瀏覽器不同,網關并不能向客戶端發送帶有新的命名的重定向。 歡迎大家前往騰訊云+社區,獲取更多騰訊海量技術實踐干貨哦~ 本文來自云+社區翻譯社,作者ArrayZoneYour Nginx往往是構建微服務中必不可缺的一部分,從本文中...
閱讀 1661·2019-08-30 12:51
閱讀 655·2019-08-29 17:30
閱讀 3695·2019-08-29 15:17
閱讀 851·2019-08-28 18:10
閱讀 1355·2019-08-26 17:08
閱讀 2168·2019-08-26 12:16
閱讀 3428·2019-08-26 11:47
閱讀 3497·2019-08-23 16:18