nginx均衡負載訪問量
A. nginx璐熻澆鍧囪 絳栫暐
浜у搧鍨嬪彿錛歍hinkpad E15
緋葷粺鐗堟湰錛歝entos8
nginx璐熻澆鍧囪絳栫暐
Nginx璐熻澆鐨5縐嶇瓥鐣ヨ劇疆鏂規硶錛
1銆佽疆璇錛堥粯璁わ級
姣忎釜璇鋒眰鎸夋椂闂撮『搴忛愪竴鍒嗛厤鍒頒笉鍚岀殑鍚庣鏈嶅姟鍣錛屽傛灉鍚庣鏈嶅姟鍣╠own鎺夛紝鑳借嚜鍔ㄥ墧闄ゃ
upstream backserver {
server 192.168.1.62;
server 192.168.1.64;
}
2銆佹寚瀹氭潈閲
鎸囧畾杞璇㈠嚑鐜囷紝weight鏉冮噸澶у皬鍜岃塊棶姣旂巼鎴愭f瘮錛岀敤浜庡悗絝鏈嶅姟鍣ㄦц兘涓嶅潎鐨勬儏鍐點
upstream backserver {
server 192.168.1.62 weight=1;
server 192.168.1.64 weight=2;
}
3銆乮p_hash
姣忎釜璇鋒眰錛屾寜璁塊棶ip鐨刪ash緇撴灉榪涜屽垎閰嶏紝榪欐牱姣忎釜璁垮錛屼細鍥哄畾璁塊棶鍚屼竴涓鍚庣鏈嶅姟鍣錛屽彲浠ヨВ鍐硈ession鐨勯棶棰樸
upstream backserver {
ip_hash;
server 192.168.1.62:80;
server 192.168.1.64:80;
}
4銆乫air
鎸夊悗絝鏈嶅姟鍣ㄧ殑鍝嶅簲鏃墮棿鏉ュ垎閰嶈鋒眰錛屽搷搴旀椂闂寸煭鐨勪紭鍏堝垎閰嶃
upstream backserver {
server server1;
server server2;
fair;
}
5銆乽rl_hash
鎸夎塊棶url鐨刪ash緇撴灉鏉ュ垎閰嶈鋒眰錛屼嬌姣忎釜url瀹氬悜鍒板悓涓涓鍚庣鏈嶅姟鍣錛屽悗絝鏈嶅姟鍣ㄤ負緙撳瓨鏃舵瘮杈冩湁鏁堛
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
鎬葷粨錛歂ginx璐熻澆鐨5縐嶇瓥鐣ヨ劇疆鏂規硶錛
1. 杞璇錛堥粯璁わ級
2. 鎸囧畾鏉冮噸
3. IP緇戝畾 ip_hash
4. fair
5. url_hash
B. nginx如何實現負載均衡、限流、緩存、黑白名單和灰度發布
1.負載均衡配置
2.失敗重試配置
在fail_timeout時間內失敗了max_fails次請求後,認為上游伺服器不可用,就會將服務地址剔除掉,fail_timeout時間後會再次將伺服器加入存活列表進行重試。
limit_req_zone指令設置參數
參數說明
limit_req_zone定義在http塊中,$binary_remote_addr表示保存客戶端IP地址的二進制形式。
Zone定義IP狀態及URL訪問頻率的共享內存區域。zone=keyword標識區域的名字,以及冒號後面跟區域大小。16000個IP地址的狀態信息約1MB,例子區域可以存儲160000個IP地址。
Rate定義最大請求速率。示例中速率不能超過每秒10個請求。
設置限流
burs排隊大小,nodelay不限制單個請求間的時間。具體使用可以查看高並發場景如何使用nginx實現限流-實戰篇
不限流白名單
該配置說明 192.168.1.0/24網段的ip訪問是不限流的,其它限流。ip後面數字的含義
24表示子網掩碼:255.255.255.0
16表示子網掩碼:255.255.0.0
8表示子網掩碼:255.0.0.0
1.瀏覽器緩存 靜態資源緩存用expire
Response Header中添加了Expires和Cache-Control
所謂的靜態資源一般包括一直不變的圖像,如網站的logo,js、css靜態文件還有可下載的內容,媒體文件
協商緩存(add_header ETag/Last-Modified value)包括html文件,經常替換的圖片,經常需要修改的js、css文件和基本不變的api介面
不需要緩存包括用戶隱私等敏感數據,用戶經常變動的api介面
2.代理層緩存
在本地磁碟創建一個文件目錄,根據我們的配置把請求資源以k(key自定義,這邊用url的hash值)->v形式緩存到目錄里,並根據需求對內容設置緩存時長,比如狀態碼為200緩存10分鍾,其餘的緩存1分鍾等待。要清理緩存可以藉助purger的功能。如果ab測試/個性化需求時應禁用瀏覽器緩存,否則會因為緩存導致誤差。
方式一
方式二 lua+redis動態黑名單(openresty)
配置(/usr/local/openresty/nginx/conf/nginx.conf)
lua腳本編寫(ip_blacklist.lua)
1.根據cookie實現灰度發布
根據cooke查詢version值,根據version跳轉到對應的host,如果沒有匹配上的就跳轉到默認配置。
2.根據來路ip實現灰度發布
C. 使用Nginx實現負載均衡
一、負載均衡的作用
1、轉發功能
按照一定的演算法【權重、輪詢】,將客戶端請求轉發到不同應用伺服器上,減輕單個伺服器壓力,提高系統並發量。
2、故障移除
通過心跳檢測的方式,判斷應用伺服器當前是否可以正常工作,如果伺服器期宕掉,自動將請求發送到其他應用伺服器。
3、恢復添加
如檢測到發生故障的應用伺服器恢復工作,自動將其添加到處理用戶請求隊伍中。
二、Nginx實現負載均衡
1、源地址哈希法:根據獲取客戶端的IP地址,通過哈希函數計算得到一個數值,用該數值對伺服器列表的大小進行取模運算,得到的結果便是客服端要訪問伺服器的序號。採用源地址哈希法進行負載均衡,同一IP地址的客戶端,當後端伺服器列表不變時,它每次都會映射到同一台後端伺服器進行訪問。
2、輪詢法:將請求按順序輪流地分配到後端伺服器上,它均衡地對待後端的每一台伺服器,而不關心伺服器實際的連接數和當前的系統負載。
3、隨機法:通過系統的隨機演算法,根據後端伺服器的列表大小值來隨機選取其中的一台伺服器進行訪問。
4、加權輪詢法:不同的後端伺服器可能機器的配置和當前系統的負載並不相同,因此它們的抗壓能力也不相同。給配置高、負載低的機器配置更高的權重,讓其處理更多的請;而配置低、負載高的機器,給其分配較低的權重,降低其系統負載,加權輪詢能很好地處理這一問題,並將請求順序且按照權重分配到後端。
5、加權隨機法:與加權輪詢法一樣,加權隨機法也根據後端機器的配置,系統的負載分配不同的權重。不同的是,它是按照權重隨機請求後端伺服器,而非順序。
6、最小連接數法:由於後端伺服器的配置不盡相同,對於請求的處理有快有慢,最小連接數法根據後端伺服器當前的連接情況,動態地選取其中當前積壓連接數最少的一台伺服器來處理當前的請求,盡可能地提高後端服務的利用效率,將負責合理地分流到每一台伺服器。
三、配置說明
四、輪詢
五、權重
六、iphash
七、最少鏈接
八、fair
九、完整代碼
十、也可以使用域名
D. 13《Nginx 入門教程》Nginx負載均衡(下)
這一小節中,我們將實戰 Nginx 的四層和七層負載均衡功能。條件有限,使用一台公網主機,在上面搭建好 Nginx 服務。公網 IP 為 180.76.152.113。
首先會進行簡單的四層負載均衡實驗,不會涉及多種負載均衡演算法,只使用默認的 Round-Robin演算法。在後續的七層負載均衡實驗中,會重點測試不同的負載均衡策略,完成相關實驗。
首先在 nginx.conf 中添加如下 stream 指令塊配置:
上述配置用埠3000和3001模擬兩個上游伺服器,然後在 upstream 指令塊中指定這兩個上游伺服器的地址,同時給第一個設置權重為2。由於默認採用的是加權的 Round-Robin 演算法,默認伺服器的權重為1。設置為2,表明3次請求中,2次會轉發到3000埠,一次會轉發到3001埠,下面的測試也驗證了這一點。
和四層的配置其實差不多,在七層中除了測試最基本的,我們還將測試前面提到的幾種負載均衡策略,進一步熟悉 Nginx 中的負載均衡配置。
在 nginx.conf 中添加如下的 http 指令塊:
上述配置中,我們用8000,8001和8002三個埠模擬了3個上游伺服器,默認使用輪詢負載均衡演算法,而且三個的權重均為1。進行如下的 http 請求操作,可以看到 Nginx 轉發 http 請求會均勻地分配到3個伺服器上。
我們打開 ip_hash 指令的注釋,這個時候默認是使用客戶端的 ip 地址作為 hash 的 key,然後重啟 Nginx 服務並進行如下的命令行操作:
接下來,注釋 ip_hash 指令,我們打開 hash user_$arg_username 這行配置的注釋, hash 指令可以讓我們根據我們設置的 key 進行 hash,然後根據 hash 值選擇上游的伺服器。具體測試參看下面的 Linux 命令:
這里我們可以看到,在請求中帶上 username 參數,Nginx 中配置的 hash 演算法會根據請求中帶的 username 參數作為 key 去進行 hash,然後在根據 hash 結果映射上游伺服器。username 相同時,選擇的上游伺服器肯定是一樣的,只有在 username 的值發生變化時,返回的響應才可能有變化。
今天我們完成了幾個測試實驗,主要是針對 Nginx 的四層和七層的負載均衡功能進行了測試。這個功能在微服務部署中會有較多的應用。因為高流量企業為保證服務的高可用性,往往會水平擴展多個相同功能的服務,部署在多台主機上,這個時候負載均衡技術就能派上用場了,而 Nginx 提供了完善的負載均衡功能以及多種負載均衡演算法,能滿足大部分企業的需求,如果還不夠,可以通過編寫內部開發模塊並集成到 Nginx,實現相應的需求。所以說 Nginx 是非常值得學習和深入研究的。