- 軟件開(kāi)發(fā)
-
反向代理概念
反向代理就是網(wǎng)站通過(guò)一臺(tái)服務(wù)器發(fā)布到公網(wǎng),供用戶訪問(wèn)。用戶直接訪問(wèn)那臺(tái)反向代理服務(wù)器,然后通過(guò)那臺(tái)服務(wù)器訪問(wèn)到網(wǎng)站。用戶無(wú)法得到網(wǎng)站的真實(shí)IP地 址。這樣就保護(hù)了網(wǎng)站服務(wù)器,如果您有臺(tái)服務(wù)器在國(guó)內(nèi)又不想讓人找到IP,就可以在國(guó)外搭建一臺(tái)反向代理服務(wù)器。一個(gè)反向代理服務(wù)器將很多網(wǎng)站解析到同一 ip地址上。
負(fù)載均衡
當(dāng)一臺(tái)服務(wù)器的單位時(shí)間內(nèi)的訪問(wèn)量越大時(shí),服務(wù)器壓力就越大,大到超過(guò)自身承受能力時(shí),服務(wù)器就會(huì)崩潰。為了避免服務(wù)器崩潰,讓用戶有更好的體驗(yàn),我們通過(guò)負(fù)載均衡的方式來(lái)分擔(dān)服務(wù)器壓力。
我們可以建立很多很多服務(wù)器,組成一個(gè)服務(wù)器集群,當(dāng)用戶訪問(wèn)網(wǎng)站時(shí),先訪問(wèn)一個(gè)中間服務(wù)器,在讓這個(gè)中間服務(wù)器在服務(wù)器集群中選擇一個(gè)壓力較小的服務(wù)器,然后將該訪問(wèn)請(qǐng)求引入該服務(wù)器。如此以來(lái),用戶的每次訪問(wèn),都會(huì)保證服務(wù)器集群中的每個(gè)服務(wù)器壓力趨于平衡,分擔(dān)了服務(wù)器壓力,避免了服務(wù)器崩潰的情況。
Nginx負(fù)載均衡設(shè)置
直接上圖
Nginx 負(fù)載均衡主要使用upstream模塊完成,upstream指令主要是用于設(shè)置一組可以在proxy_pass和fastcgi_pass指令中使用代理服務(wù)器,默認(rèn)均在均衡方式為輪詢。
nginx負(fù)載均衡的幾種方式
1• 輪詢(默認(rèn))
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能自動(dòng)剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15; }
2• weight
指定輪詢幾率,weight和訪問(wèn)比率成正比,用于后端服務(wù)器性能不均的 情況。
權(quán)重越高,在被訪問(wèn)的概率越大,如上例,概率相同,等同于50%,50%
注意
•上述方式存在一個(gè)問(wèn)題就是說(shuō),在負(fù)載均衡系統(tǒng)中,假如用戶在某臺(tái)服務(wù)器上登錄了,那么該用戶第二次請(qǐng)求的時(shí)候,因?yàn)槲覀兪秦?fù)載均衡系統(tǒng),每次請(qǐng)求都會(huì)重新定位到服務(wù)器集群中的某一個(gè),那么已經(jīng)登錄某一個(gè)服務(wù)器的用戶再重新定位到另一個(gè)服務(wù)器,其登錄信息將會(huì)丟失,這樣顯然是不妥的。
我們可以采用ip_hash指令解決這個(gè)問(wèn)題,如果客戶已經(jīng)訪問(wèn)了某個(gè)服務(wù)器,當(dāng)用戶再次訪問(wèn)時(shí),會(huì)將該請(qǐng)求通過(guò)哈希算法,自動(dòng)定位到該服務(wù)器。
每個(gè)請(qǐng)求按訪問(wèn)ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)一個(gè)后端服務(wù)器,可以解決session的問(wèn)題。
upstream backserver { ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80; }
3• fair(第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。
upstream backserver { server server1; server server2; fair; }
4• url_hash(第三方)
按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}