Nginx(反向代理服務(wù)器)
正向代理
場景:在國內(nèi)是無法正常使用google.com。如果想要訪問google.com,可以購買一臺國外的服務(wù)器A狸涌,此時(shí)你和服務(wù)器A的網(wǎng)絡(luò)是相通的缠导。而服務(wù)器A又跟google.com相通, 此時(shí)可以由服務(wù)器A代理你(客戶端)碘箍,去訪問google.com遵馆。這個(gè)過程稱之為正向代理,服務(wù)端(google.com)只需要知道代理服務(wù)器的ip丰榴,不需要知道客戶端的ip货邓。
示例1:
示例2:
結(jié)論:正向代理,是用于代理客戶端的四濒。
反向代理
場景:當(dāng)一個(gè)服務(wù)器接受過多來自客戶端的請求時(shí)换况,服務(wù)器難以處理和響應(yīng)這些請求,會使得整個(gè)系統(tǒng)性能下降盗蟆。為了解決這個(gè)難題戈二,可以提供多臺部署相同應(yīng)用的服務(wù)器,讓客戶端的請求分別發(fā)送到不同的服務(wù)器上喳资,這樣單機(jī)服務(wù)器的壓力就會降低很多觉吭,整體性能便會提升。但是有一個(gè)問題仆邓,每個(gè)服務(wù)器ip都是不同的鲜滩,也就是說客戶端的請求要發(fā)送到多個(gè)不同的ip上。讓客戶手動指定ip進(jìn)行請求节值,這種方式很不明智徙硅。首先是客戶的隨機(jī)性,不知道會訪問哪臺服務(wù)器搞疗,其次嗓蘑,會造成一部分服務(wù)器壓力大,一部分服務(wù)器幾乎沒有使用匿乃,浪費(fèi)資源桩皿。因此,這里就需要一個(gè)角色去代理服務(wù)器幢炸,讓客戶端的請求直接發(fā)送到這個(gè)角色上泄隔,由這個(gè)角色去分發(fā)請求到不同的服務(wù)器上。
這個(gè)角色就是反向代理服務(wù)器阳懂。
結(jié)論:反向代理梅尤,是用于代理服務(wù)端的柜思。
負(fù)載均衡
場景:反向代理過程中岩调,每臺服務(wù)器處理來自客戶端的請求都應(yīng)該是均衡的。
原理:使用一個(gè)反向代理服務(wù)器指向多臺部署相同應(yīng)用的服務(wù)器赡盘,客戶端請求直接向反向代理服務(wù)器發(fā)起号枕,反向代理服務(wù)器根據(jù)負(fù)載均衡機(jī)制,將請求轉(zhuǎn)發(fā)到不同的應(yīng)用服務(wù)器上陨享。
nginx提供了以下三種負(fù)載均衡機(jī)制:
- round-robin:請求以循環(huán)葱淳、輪轉(zhuǎn)的方式分發(fā)到服務(wù)器
- least-connected:下一個(gè)請求被分配到擁有最少活動連接數(shù)的服務(wù)器
- ip-hash:使用一個(gè)哈希函數(shù)钝腺,基于客戶端ip地址判斷下一個(gè)請求應(yīng)該被分發(fā)到哪臺服務(wù)器
循環(huán)、輪轉(zhuǎn)負(fù)載均衡
round-robin:默認(rèn)情況下赞厕,使用循環(huán)艳狐、輪轉(zhuǎn)的方式分發(fā)請求到服務(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)皿桑。所有請求都會被代理到myapp服務(wù)器毫目,根據(jù)負(fù)載均衡機(jī)制分發(fā)請求。
最少連接負(fù)載均衡
least-connected:當(dāng)一些請求處理的時(shí)間比較長時(shí)诲侮,最少連接負(fù)載均衡能夠爭取到更大的公平镀虐。
配置示例:
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ù)請求的目標(biāo)ip地址沟绪,作為散列鍵(Hash Key)從靜態(tài)分配的散列表找出對應(yīng)的服務(wù)器刮便,若該服務(wù)器可用且未超載,則將請求發(fā)送帶服務(wù)器绽慈,否則返回空恨旱。
配置示例:
upstream myapp{
ip-hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
不過,Nginx雖然強(qiáng)大久信,但是還是有很多問題的窖杀。
1. 單純使用Nginx,會造成配置維護(hù)成本變高裙士。
2. 單點(diǎn)故障率增加入客,因?yàn)闊狳c(diǎn)服務(wù)的訪問量很高,如果這個(gè)服務(wù)的負(fù)載均衡服務(wù)出現(xiàn)問題腿椎,整個(gè)服務(wù)都會掛點(diǎn)桌硫。
因此,可以結(jié)合Zookeeper去使用啃炸。
Nginx和Zookeeper搭配使用铆隘,詳情見:https://blog.csdn.net/xiangjai/article/details/56844400