Nginx(反向代理服務(wù)器)
正向代理
場(chǎng)景:在國(guó)內(nèi)是無(wú)法正常使用google.com。如果想要訪問(wèn)google.com,可以購(gòu)買一臺(tái)國(guó)外的服務(wù)器A,此時(shí)你和服務(wù)器A的網(wǎng)絡(luò)是相通的。而服務(wù)器A又跟google.com相通, 此時(shí)可以由服務(wù)器A代理你(客戶端),去訪問(wèn)google.com。這個(gè)過(guò)程稱之為正向代理,服務(wù)端(google.com)只需要知道代理服務(wù)器的ip,不需要知道客戶端的ip。
示例1:

示例2:

結(jié)論:正向代理,是用于代理客戶端的。
反向代理
場(chǎng)景:當(dāng)一個(gè)服務(wù)器接受過(guò)多來(lái)自客戶端的請(qǐng)求時(shí),服務(wù)器難以處理和響應(yīng)這些請(qǐng)求,會(huì)使得整個(gè)系統(tǒng)性能下降。為了解決這個(gè)難題,可以提供多臺(tái)部署相同應(yīng)用的服務(wù)器,讓客戶端的請(qǐng)求分別發(fā)送到不同的服務(wù)器上,這樣單機(jī)服務(wù)器的壓力就會(huì)降低很多,整體性能便會(huì)提升。但是有一個(gè)問(wèn)題,每個(gè)服務(wù)器ip都是不同的,也就是說(shuō)客戶端的請(qǐng)求要發(fā)送到多個(gè)不同的ip上。讓客戶手動(dòng)指定ip進(jìn)行請(qǐng)求,這種方式很不明智。首先是客戶的隨機(jī)性,不知道會(huì)訪問(wèn)哪臺(tái)服務(wù)器,其次,會(huì)造成一部分服務(wù)器壓力大,一部分服務(wù)器幾乎沒(méi)有使用,浪費(fèi)資源。因此,這里就需要一個(gè)角色去代理服務(wù)器,讓客戶端的請(qǐng)求直接發(fā)送到這個(gè)角色上,由這個(gè)角色去分發(fā)請(qǐng)求到不同的服務(wù)器上。
這個(gè)角色就是反向代理服務(wù)器。
結(jié)論:反向代理,是用于代理服務(wù)端的。
負(fù)載均衡
場(chǎng)景:反向代理過(guò)程中,每臺(tái)服務(wù)器處理來(lái)自客戶端的請(qǐng)求都應(yīng)該是均衡的。
原理:使用一個(gè)反向代理服務(wù)器指向多臺(tái)部署相同應(yīng)用的服務(wù)器,客戶端請(qǐng)求直接向反向代理服務(wù)器發(fā)起,反向代理服務(wù)器根據(jù)負(fù)載均衡機(jī)制,將請(qǐng)求轉(zhuǎn)發(fā)到不同的應(yīng)用服務(wù)器上。
nginx提供了以下三種負(fù)載均衡機(jī)制:
- round-robin:請(qǐng)求以循環(huán)、輪轉(zhuǎn)的方式分發(fā)到服務(wù)器
- least-connected:下一個(gè)請(qǐng)求被分配到擁有最少活動(dòng)連接數(shù)的服務(wù)器
- ip-hash:使用一個(gè)哈希函數(shù),基于客戶端ip地址判斷下一個(gè)請(qǐng)求應(yīng)該被分發(fā)到哪臺(tái)服務(wù)器
循環(huán)、輪轉(zhuǎn)負(fù)載均衡
round-robin:默認(rèn)情況下,使用循環(huán)、輪轉(zhuǎn)的方式分發(fā)請(qǐng)求到服務(wù)器
配置示例:
http{
upstream myapp{
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server{
listen 80;
location / {
proxy_pass http://myapp;
}
}
}
當(dāng)不指定負(fù)載均衡方式時(shí),默認(rèn)以round-robin方式實(shí)現(xiàn)。所有請(qǐng)求都會(huì)被代理到myapp服務(wù)器,根據(jù)負(fù)載均衡機(jī)制分發(fā)請(qǐng)求。
最少連接負(fù)載均衡
least-connected:當(dāng)一些請(qǐng)求處理的時(shí)間比較長(zhǎng)時(shí),最少連接負(fù)載均衡能夠爭(zhēng)取到更大的公平。
配置示例:
upstream myapp{
least-conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
基于ip地址的負(fù)載均衡
ip-hash:采用目標(biāo)地址散列調(diào)度(Destination Hashing Scheduling)算法,根據(jù)請(qǐng)求的目標(biāo)ip地址,作為散列鍵(Hash Key)從靜態(tài)分配的散列表找出對(duì)應(yīng)的服務(wù)器,若該服務(wù)器可用且未超載,則將請(qǐng)求發(fā)送帶服務(wù)器,否則返回空。
配置示例:
upstream myapp{
ip-hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
不過(guò),Nginx雖然強(qiáng)大,但是還是有很多問(wèn)題的。
1. 單純使用Nginx,會(huì)造成配置維護(hù)成本變高。
2. 單點(diǎn)故障率增加,因?yàn)闊狳c(diǎn)服務(wù)的訪問(wèn)量很高,如果這個(gè)服務(wù)的負(fù)載均衡服務(wù)出現(xiàn)問(wèn)題,整個(gè)服務(wù)都會(huì)掛點(diǎn)。
因此,可以結(jié)合Zookeeper去使用。
Nginx和Zookeeper搭配使用,詳情見:https://blog.csdn.net/xiangjai/article/details/56844400