Nginx反向代理與負(fù)載均衡

《老男孩Linux運(yùn)維》
Nginx Documentation



集群簡(jiǎn)介

集群就是指一組(若干)相互獨(dú)立的計(jì)算機(jī),利用高速通信網(wǎng)絡(luò)組成的一個(gè)較大的計(jì)算機(jī)服務(wù)系統(tǒng),每個(gè)集群結(jié)點(diǎn)都是運(yùn)行各自服務(wù)的獨(dú)立服務(wù)器。這些服務(wù)器之間可以彼此通信,協(xié)同向用戶提供應(yīng)用程序、系統(tǒng)資源和數(shù)據(jù),并以單一系統(tǒng)的模式加以管理。
當(dāng)客戶機(jī)請(qǐng)求集群系統(tǒng)時(shí),集群給用戶的感覺(jué)就是一個(gè)單一獨(dú)立的服務(wù)器,而實(shí)際上用戶請(qǐng)求的是一組集群服務(wù)器。

若用一句話描述集群,即一堆服務(wù)器合作做同一件事,這些機(jī)器可能需要整個(gè)技術(shù)團(tuán)隊(duì)架構(gòu)、設(shè)計(jì)和統(tǒng)一協(xié)調(diào)管理;可能分布在一個(gè)機(jī)房,也可能分布在全國(guó)各地。


集群邏輯圖


為什么要使用集群

高性能(Performance)
大型網(wǎng)站谷歌、淘寶、百度等,都不是幾臺(tái)大型機(jī)可以構(gòu)建的,都是上萬(wàn)臺(tái)服務(wù)器組成的高性能集群,分布于不同的地點(diǎn)。

只有當(dāng)并發(fā)或總請(qǐng)求數(shù)量超過(guò)單臺(tái)服務(wù)器的承受能力時(shí),服務(wù)器集群的優(yōu)勢(shì)才會(huì)體現(xiàn)出來(lái)。

價(jià)格有效性(Cost-effectiveness)
在達(dá)到同樣性能的需求下,采用計(jì)算機(jī)集群架構(gòu)比采用同等運(yùn)算能力的大型計(jì)算機(jī)具有更高的性價(jià)比。

可伸縮性(Scalability)
當(dāng)服務(wù)負(fù)載、壓力增長(zhǎng)時(shí),針對(duì)集群系統(tǒng)進(jìn)行較簡(jiǎn)單的擴(kuò)展即可滿足需求,且不會(huì)降低服務(wù)質(zhì)量。

高可用(Availability)
單一計(jì)算機(jī)發(fā)生故障時(shí),就無(wú)法正常提供服務(wù);而集群架構(gòu)技術(shù)可以是得系統(tǒng)在若干硬件設(shè)備發(fā)生故障時(shí)仍可以繼續(xù)工作。
集群系統(tǒng)在提高系統(tǒng)可靠性的同時(shí),也大大減小了系統(tǒng)故障帶來(lái)的業(yè)務(wù)損失,目前幾乎100%的網(wǎng)站都要求7x24h提供服務(wù)。

透明性(Transparency)
多個(gè)獨(dú)立計(jì)算機(jī)組成的耦合集群系統(tǒng)構(gòu)成一個(gè)虛擬服務(wù)器。用戶訪問(wèn)集群系統(tǒng)時(shí),就像訪問(wèn)一臺(tái)高性能、高可用的服務(wù)器一樣,集群中一部分服務(wù)器的上線、下線不會(huì)中斷整個(gè)系統(tǒng)服務(wù),這對(duì)用戶也是透明的。

可管理性(Manageability)
這個(gè)系統(tǒng)可能在物理上很大,但其實(shí)很容易管理,就像管理一個(gè)單一映像系統(tǒng)一樣。

可編程性(Programmability)
在集群系統(tǒng)上,容易開(kāi)發(fā)及修改各類應(yīng)用程序。


集群的分類

集群的常見(jiàn)分類

計(jì)算機(jī)集群架構(gòu)按功能和結(jié)構(gòu)可分為以下幾類:

  • 負(fù)載均衡集群(Load balancing clusters),LB;
  • 高可用性集群(High-availability clusters), HA;
  • 高性能計(jì)算集群(High-performance cluster),HP;
  • 網(wǎng)格計(jì)算集群(Grid computing);

負(fù)載均衡集群(LB)和高可用性集群(HA)是互聯(lián)網(wǎng)行業(yè)常用的集群架構(gòu)模式


不同種類的集群介紹

負(fù)載均衡集群

負(fù)載均衡集群可以把很多客戶集中的訪問(wèn)請(qǐng)求負(fù)載壓力盡可能平均分?jǐn)傇谟?jì)算機(jī)集群中處理。
集群中每個(gè)節(jié)點(diǎn)都可以一定的訪問(wèn)請(qǐng)求負(fù)載壓力,并且可以實(shí)現(xiàn)訪問(wèn)請(qǐng)求在各節(jié)點(diǎn)之間動(dòng)態(tài)分配,以實(shí)現(xiàn)負(fù)載均衡。

負(fù)載均衡集群運(yùn)行時(shí),一般是通過(guò)一個(gè)或多個(gè)前端負(fù)載均衡器(Director)將客戶訪問(wèn)請(qǐng)求分發(fā)到后端的一組服務(wù)器上,從而達(dá)到整個(gè)系統(tǒng)的高性能和高可用性。
一般高可用性集群和負(fù)載均衡集群會(huì)使用類似的技術(shù),或同時(shí)具有高可用性與負(fù)載均衡的特點(diǎn)。

載均衡集群的作用:

  • 分擔(dān)用戶訪問(wèn)請(qǐng)求及數(shù)據(jù)流量(負(fù)載均衡);
  • 保持業(yè)務(wù)連續(xù)性,即7x24h服務(wù)(高可用);
  • 應(yīng)用于Web業(yè)務(wù)及數(shù)據(jù)庫(kù)從庫(kù)等服務(wù)器的業(yè)務(wù);

負(fù)載均衡集群典型的開(kāi)源軟件包括:LVS、Nginx、Haproxy 等。

高可用性集群

一般是指集群中任意一個(gè)節(jié)點(diǎn)失效的情況下,該節(jié)點(diǎn)上的所有任務(wù)會(huì)自動(dòng)轉(zhuǎn)移到其他正常的節(jié)點(diǎn)上。此過(guò)程不會(huì)影響整個(gè)集群的運(yùn)行。

不同的業(yè)務(wù)會(huì)有若干秒的切換時(shí)間,DB業(yè)務(wù)明顯長(zhǎng)于Web業(yè)務(wù)切換時(shí)間。

當(dāng)集群中的一個(gè)節(jié)點(diǎn)系統(tǒng)發(fā)生故障時(shí),運(yùn)行著的集群服務(wù)器會(huì)迅速做出反應(yīng),將該系統(tǒng)的服務(wù)分配到集群中其他正在工作的系統(tǒng)上運(yùn)行。考慮到計(jì)算機(jī)硬件和軟件的容錯(cuò)性,高可用性集群的主要目的是使局群的整體服務(wù)盡可能可用。
如果高可用集群中的主節(jié)點(diǎn)發(fā)生了故障,那么這段時(shí)間內(nèi)將由備節(jié)點(diǎn)代替它。備節(jié)點(diǎn)通常是主節(jié)點(diǎn)的鏡像。當(dāng)它代替主節(jié)點(diǎn)時(shí),它可以完全接管主節(jié)點(diǎn)(包括Ip和其他資源)提供服務(wù),因此,使集群系統(tǒng)環(huán)境對(duì)系統(tǒng)環(huán)境來(lái)說(shuō)是一致的,既不會(huì)影響用戶的訪問(wèn)。

高可用性集群使服務(wù)器系統(tǒng)的運(yùn)行速度和響應(yīng)速度會(huì)盡可能的快。它們經(jīng)常利用在多臺(tái)機(jī)器上運(yùn)行的冗余節(jié)點(diǎn)和服務(wù)來(lái)相互跟蹤。
如果某個(gè)節(jié)點(diǎn)失敗,它的替補(bǔ)者將在幾秒鐘或更多時(shí)間內(nèi)接管它的職責(zé)。因此,對(duì)于用戶來(lái)說(shuō),集群里的任意一臺(tái)機(jī)器宕機(jī),業(yè)務(wù)都不會(huì)受影響。

高可用性集群的作用為:

  • 當(dāng)一臺(tái)機(jī)器宕機(jī)后,另外一臺(tái)機(jī)器接管宕機(jī)的機(jī)器的Ip資源和服務(wù)資源,提供服務(wù);
  • 常用于不易實(shí)現(xiàn)負(fù)載均衡的應(yīng)用,如負(fù)載均衡器、主數(shù)據(jù)庫(kù)、主存儲(chǔ)對(duì)之間;

高可用性集群常用開(kāi)源軟件包括:Keepalived、Heartbeat 等。

高性能計(jì)算集群

高性能計(jì)算集群也稱并行計(jì)算。通常,高性能計(jì)算集群涉及為集群開(kāi)發(fā)的并行應(yīng)用程序,以解決復(fù)雜的科學(xué)問(wèn)題。

高性能計(jì)算集群對(duì)外就好像一個(gè)超級(jí)計(jì)算機(jī),這種超級(jí)計(jì)算機(jī)內(nèi)部由數(shù)萬(wàn)個(gè)獨(dú)立服務(wù)器組成,并且在公共消息傳遞層上進(jìn)行通信以運(yùn)行并行應(yīng)用程序。

在互聯(lián)網(wǎng)網(wǎng)站運(yùn)維中,常用的是負(fù)載均衡集群和高可用性集群


常用集群軟硬件介紹及選型

企業(yè)運(yùn)維中常見(jiàn)集群軟硬件產(chǎn)品
互聯(lián)網(wǎng)企業(yè)常用開(kāi)源集群軟件: Nginx,LVS,Haproxy,Keepalived,Heartbeat
互聯(lián)網(wǎng)企業(yè)常用的商業(yè)集群硬件: F5,Netscaler,Radware,A10 等。

對(duì)于集群軟硬件產(chǎn)品選擇

  • 當(dāng)企業(yè)業(yè)務(wù)重要,技術(shù)力量又薄弱,并且希望出錢購(gòu)買產(chǎn)品以獲得更好的服務(wù)時(shí),可選擇硬件負(fù)載均衡產(chǎn)品;
  • 并用軟件以及硬件產(chǎn)品負(fù)載均衡產(chǎn)品來(lái)分擔(dān)單一產(chǎn)品的風(fēng)險(xiǎn);
  • 中小型互聯(lián)網(wǎng)企業(yè),會(huì)希望通過(guò)使用開(kāi)源免費(fèi)的方案來(lái)解決問(wèn)題。

如何選擇開(kāi)源集群軟件產(chǎn)品

  • 網(wǎng)站在并發(fā)訪問(wèn)和總訪問(wèn)量不是很大的情況下,建議首選Nginx負(fù)載均衡,Nginx配置簡(jiǎn)單使用方便安全穩(wěn)定。 另一個(gè)實(shí)現(xiàn)負(fù)載均衡的產(chǎn)品為Haproxy;
  • 如果要考慮Nginx負(fù)載均衡的高可用功能,建議首選Keepalived軟件,因?yàn)榘惭b配置簡(jiǎn)單方便穩(wěn)定。類似高可用軟件還有Heartbeat,但比較復(fù)雜;
  • 如果是大型企業(yè),負(fù)載均衡可以使用 LVS+Keepalived 在前端做四層轉(zhuǎn)發(fā),后端使用Nginx或Haproxy做七層轉(zhuǎn)發(fā),再后面是應(yīng)用服務(wù)器。如果是數(shù)據(jù)庫(kù)與存儲(chǔ)的負(fù)載均衡和高可用,可選值 LVS+Heartbeat;
高可用+負(fù)載均衡




Nginx負(fù)載均衡集群介紹

反向代理與負(fù)載均衡概念簡(jiǎn)介

嚴(yán)格地說(shuō),Nginx僅僅是作為Nginx Proxy反向代理使用的,因?yàn)檫@個(gè)反向代理功能表現(xiàn)的效果是負(fù)載均衡集群的效果,所以本文稱之為Nginx負(fù)載均衡。

普通的負(fù)載均衡軟件,如LVS,其實(shí)現(xiàn)的功能只是對(duì)請(qǐng)求數(shù)據(jù)包的轉(zhuǎn)發(fā)、傳遞,從負(fù)載均衡下的節(jié)點(diǎn)服務(wù)器來(lái)看,接收到的請(qǐng)求還是來(lái)自訪問(wèn)負(fù)載均衡器的客戶端的真實(shí)用戶;
而反向代理就不一樣了,反向代理服務(wù)器在接收訪問(wèn)用戶請(qǐng)求后,會(huì)代理用戶 重新發(fā)起請(qǐng)求代理下的節(jié)點(diǎn)服務(wù)器,最后把數(shù)據(jù)返回給客戶端用戶。在節(jié)點(diǎn)服務(wù)器看來(lái),訪問(wèn)的節(jié)點(diǎn)服務(wù)器的客戶端用戶就是反向代理服務(wù)器,而非真實(shí)的網(wǎng)站訪問(wèn)用戶。

即,LVS等負(fù)載均衡是轉(zhuǎn)發(fā)用戶請(qǐng)求的數(shù)據(jù)包,而Nginx反向代理是接收用戶請(qǐng)求后重新發(fā)起請(qǐng)求后端節(jié)點(diǎn)。

這里我去看了一下Nginx的Access.log,客戶端的訪問(wèn)日志全在代理節(jié)點(diǎn)上(Nginx-upstream),而后端節(jié)點(diǎn)的Access.log的來(lái)源是前端代理節(jié)點(diǎn)的IP

實(shí)現(xiàn)Nginx負(fù)載均衡的組件

實(shí)現(xiàn)Nginx負(fù)載均衡的組件主要有兩個(gè):"proxy"和"upstream":

Nginx_http模塊 模塊說(shuō)明
ngx_http_proxy_module proxy代理模塊,用于把請(qǐng)求后拋給服務(wù)器節(jié)點(diǎn)或upstream服務(wù)器池
ngx_http_upstream_module 負(fù)載均衡模塊,可以實(shí)現(xiàn)網(wǎng)站的負(fù)載均衡功能即節(jié)點(diǎn)的健康檢查


Nginx負(fù)載均衡核心組件介紹

Nginx upstream模塊

Module ngx_http_upstream_module

Syntax:    upstream name { ... }
Default:    —
Context:    http

Nginx模塊介紹

Nginx的負(fù)載均衡功能依賴于ngx_http_upstream_module模塊,所支持的代理方式包括:proxy_pass, fastcgi_pass, memcached_pass, uwsgi_pass, scgi_pass 等,這里主要講解proxy_pass方式。

upstream模塊允許Nginx定義一組或多組節(jié)點(diǎn)服務(wù)器組,使用時(shí)可通過(guò) proxy_pass 代理方式把網(wǎng)站的請(qǐng)求發(fā)送到事先定義好的對(duì)應(yīng) Upstream組 的名字上。

upstream模塊語(yǔ)法

upstream模塊內(nèi)容放置于http{ }內(nèi):

upstream upstream_name {
    server  address  [ parameters ]
}

#address可以是主機(jī)名、域名、ip或Unix Socket,也可以指定端口號(hào)

#parameters代表可選參數(shù), 有如下:
#backup,表示當(dāng)前server是備用服務(wù)器,只有其它非backup后端服務(wù)器都掛掉了或很忙才會(huì)分配請(qǐng)求給它;
#weight,表示當(dāng)前server負(fù)載權(quán)重,權(quán)重越大幾率愈高;
#max_fails 和 fail_timeout 一般會(huì)關(guān)聯(lián)使用,如果某臺(tái)server在 fail_timeout 時(shí)間內(nèi)出現(xiàn)了 max_fails 次連接失敗,那么Nginx會(huì)認(rèn)為其已經(jīng)掛掉,從而在 fail_timeout 時(shí)間內(nèi)不再去請(qǐng)求它,fail_timeout默認(rèn)是 10s,max_fails默認(rèn)是1,即默認(rèn)情況只要是發(fā)生錯(cuò)誤就認(rèn)為服務(wù)器掛了,如果將max_fails設(shè)置為0,則表示取消這項(xiàng)檢查;
#down,標(biāo)志服務(wù)器永遠(yuǎn)不可用,可配合ip_hash使用。
upstream模塊內(nèi)參數(shù) 參數(shù)說(shuō)明
weight 服務(wù)器權(quán)重
max_fails Nginx嘗試連接后端主機(jī)失敗的此時(shí),這是值是配合 proxy_next_upstream、fastcgi_next_upstream和memcached_next_upstream這三個(gè)參數(shù)來(lái)使用的。當(dāng)Nginx接收后端服務(wù)器返回這三個(gè)參數(shù)定義的狀態(tài)碼時(shí),會(huì)將這個(gè)請(qǐng)求轉(zhuǎn)發(fā)給正常工作的的后端服務(wù)器。如404、503、503,max_files=1
fail_timeout max_fails 和 fail_timeout 一般會(huì)關(guān)聯(lián)使用,如果某臺(tái)server在 fail_timeout 時(shí)間內(nèi)出現(xiàn)了 max_fails 次連接失敗,那么Nginx會(huì)認(rèn)為其已經(jīng)掛掉,從而在 fail_timeout 時(shí)間內(nèi)不再去請(qǐng)求它,fail_timeout默認(rèn)是 10s,max_fails默認(rèn)是1,即默認(rèn)情況只要是發(fā)生錯(cuò)誤就認(rèn)為服務(wù)器掛了,如果將max_fails設(shè)置為0,則表示取消這項(xiàng)檢查
backup 表示當(dāng)前server是備用服務(wù)器,只有其它非backup后端服務(wù)器都掛掉了或很忙才會(huì)分配請(qǐng)求給它
down 標(biāo)志服務(wù)器永遠(yuǎn)不可用,可配合ip_hash使用

舉個(gè)栗子:

upstream test {
  server 191.168.1.11 weight=5 ;
  server 191.168.1.22:82;
  server example.com:8080 max_fails=2 fail_timeout=10s backup;
  #域名的話需要解析的哦,內(nèi)網(wǎng)記得hosts
}

如果是兩臺(tái)Web服務(wù)器做高可用,常規(guī)方案就需要Keepalived配合,那么這里使用Nginx的backup參數(shù)通過(guò)負(fù)載均衡功能就可以實(shí)現(xiàn)Web服務(wù)器集群了。

upstream模塊調(diào)度算法

調(diào)度算法一般分為靜態(tài)調(diào)度算法動(dòng)態(tài)調(diào)度算法

靜態(tài)調(diào)度算法: 即負(fù)載均衡器根據(jù)自身設(shè)置的規(guī)則進(jìn)行分配,不需要考慮后端節(jié)點(diǎn)服務(wù)器的情況。如 輪詢(rr)、權(quán)重(wrr)、ip_hash

1. rr輪詢(默認(rèn)調(diào)度算法):
按照客戶端請(qǐng)求順序把請(qǐng)求逐一分配到不同的后端節(jié)點(diǎn)服務(wù)器,相當(dāng)于LVS中的rr算法。如果后端服務(wù)器宕機(jī),宕機(jī)的服務(wù)器會(huì)被自動(dòng)從節(jié)點(diǎn)服務(wù)器池中剔除,以使客戶端的用戶訪問(wèn)不受影響,新的請(qǐng)求分配給正常的服務(wù)器;

2. wrr權(quán)重輪詢
權(quán)重越大,被轉(zhuǎn)發(fā)的請(qǐng)求也就越多。可以根據(jù)服務(wù)器的配置和性能指定權(quán)重大小,有效解決新舊服務(wù)器性能不均帶來(lái)的請(qǐng)求分配問(wèn)題;

upstream weight {
  server 191.168.1.11 weight=1;
  server 192.168.1.22 weight=2;
}

3. ip_hash
每個(gè)請(qǐng)求按客戶端IP的hash結(jié)果分配,當(dāng)新的請(qǐng)求到達(dá)時(shí),先將其客戶端ip通過(guò)哈希算法得出一個(gè)值,在隨后的客戶端請(qǐng)求中,客戶IP的哈希值只要相同,就會(huì)被分配到同一臺(tái)服務(wù)器。
該調(diào)度算法可以解決動(dòng)態(tài)網(wǎng)頁(yè)的session共享問(wèn)題,但有時(shí)會(huì)導(dǎo)致請(qǐng)求分配不均,因?yàn)閲?guó)內(nèi)大多數(shù)都是NAT上網(wǎng)模式,多個(gè)客戶端對(duì)應(yīng)一個(gè)外部IP,所以這些客戶端都會(huì)被分配到同一個(gè)節(jié)點(diǎn)服務(wù)器,從而導(dǎo)致請(qǐng)求分配不均。
LVS負(fù)載均衡的-p參數(shù)、Keepalived配置里的persisitence_timeout 50參數(shù)都類似Nginx的ip_hash參數(shù),其功能都可以解決動(dòng)態(tài)網(wǎng)頁(yè)的session共享問(wèn)題。

upstream iphash {
  ip_hash;
  server 192.168.1.11;
  server 192.168.1.22:8080;
  #ip_hash中,后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)不能有 weight 和 backup,有也不會(huì)生效
}



動(dòng)態(tài)調(diào)度算法: 即負(fù)載均衡器會(huì)根據(jù)后端節(jié)點(diǎn)的當(dāng)前狀態(tài)來(lái)決定是否分發(fā)請(qǐng)求,如連接數(shù)少或響應(yīng)時(shí)間短的優(yōu)先獲得請(qǐng)求。如 fair、least_conn

4. fair
根據(jù)后端節(jié)點(diǎn)服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。這是更加智能的調(diào)度算法。
Nginx本身不支持這種算法,需要upstream_fair模塊;

upstream fair {
  server 192.168.1.11;
  server 192.168.1.22;
  fair;
}

5. least_conn
根據(jù)后端節(jié)點(diǎn)的連接數(shù)來(lái)決定分配情況,那個(gè)機(jī)器少就分發(fā);

6.url_hash
根據(jù)訪問(wèn)URL的hash結(jié)果來(lái)分配請(qǐng)求的,讓每個(gè)URL定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存服務(wù)器時(shí)效果顯著。
Nginx本身不支持url_hash,需要hash模塊軟件包;

upstream urlhash {
  server hahaha1:5678;
  server hahaha2:5678;
  hash $request_uri;
  hash_method md5;
  #同樣不能使用 weight、backup
}

7. 一致性hash
一致性hash算法一般用于代理后端業(yè)務(wù)為緩存服務(wù)器(如Memcached)的場(chǎng)景,通過(guò)將用戶請(qǐng)求的URI或者指定字符串進(jìn)行計(jì)算,然后調(diào)度到后端的服務(wù)器上,此后任何用戶查找同一個(gè)URI貨值指定字符串都會(huì)被調(diào)度到這一臺(tái)服務(wù)器上,因此后端的每個(gè)節(jié)點(diǎn)緩存的內(nèi)容都是不同的;

upstream {
  consistent_hash $request_uri;
  server xxx;
  server xxx;
}


Nginx proxy模塊

ngx_http_proxy_pass

Syntax:proxy_pass URL;
Default:—
Context:location, if in location, limit_except

proxy_pass介紹

proxy_pass指令屬于ngx_http_proxy_module模塊,此模塊可以將請(qǐng)求轉(zhuǎn)發(fā)到另一臺(tái)服務(wù)器,在實(shí)際的反向代理工作中,會(huì)通過(guò)location功能匹配指定的URI,然后把接收到服務(wù)匹配URI的請(qǐng)求通過(guò)proyx_pass拋給定義好的upstream節(jié)點(diǎn)池。

location /download/ {
  proxy_pass http://download/vedio/;
}
#這是前端代理節(jié)點(diǎn)的設(shè)置
#交給后端upstream為download的節(jié)點(diǎn)

location /name/ {
  rewrite /name/([^/]+) /users?name=$1 break;
  proyx_pass http://127.0.0.1;
}

http_proyx模塊參數(shù)

ngx_http_proxy_module參數(shù)
Nginx的代理功能是通過(guò)http_proxy模塊來(lái)實(shí)現(xiàn)的。http_proxy模塊參數(shù)舉例:

proxy模塊參數(shù) 說(shuō)明
proxy_next_upstream 什么情況下將請(qǐng)求傳遞到下一個(gè)upstream
proxy_limite_rate 限制從后端服務(wù)器讀取響應(yīng)的速率
proyx_set_header 設(shè)置http請(qǐng)求header傳給后端服務(wù)器節(jié)點(diǎn),如:可實(shí)現(xiàn)讓代理后端的服務(wù)器節(jié)點(diǎn)獲取訪問(wèn)客戶端的這是ip
client_body_buffer_size 客戶端請(qǐng)求主體緩沖區(qū)大小
proxy_connect_timeout 代理與后端節(jié)點(diǎn)服務(wù)器連接的超時(shí)時(shí)間
proxy_send_timeout 后端節(jié)點(diǎn)數(shù)據(jù)回傳的超時(shí)時(shí)間
proxy_read_timeout 設(shè)置Nginx從代理的后端服務(wù)器獲取信息的時(shí)間,表示連接成功建立后,Nginx等待后端服務(wù)器的響應(yīng)時(shí)間
proxy_buffer_size 設(shè)置緩沖區(qū)大小
proxy_buffers 設(shè)置緩沖區(qū)的數(shù)量和大小
proyx_busy_buffers_size 用于設(shè)置系統(tǒng)很忙時(shí)可以使用的proxy_buffers大小,推薦為proxy_buffers*2
proxy_temp_file_write_size 指定proxy緩存臨時(shí)文件的大小




Nginx負(fù)載均衡配置

配置后端節(jié)點(diǎn)

這兒是upstream后端節(jié)點(diǎn):

vi /etc/nginx/nginx.conf

server {
  listen 80;
  root /path/xxx;

  location / {
    xxxx;
  }
}

Nginx負(fù)載均衡反向代理節(jié)點(diǎn)

這是代理節(jié)點(diǎn):

upstream test {
  server test1 weight=1;
  server test2 weight=1;
  #域名做hosts
}
vi /etc/nginx/nginx.conf

server {
  listen 8888;
  server_name www.test.com www.xx.com;

  location  / {
    proxy_read_timeout 10s;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404;
    proyx_pass http://test;#把用戶的請(qǐng)求反向代理定義的upstream服務(wù)器池

    #proyx_set_header Host $host;在代理后端服務(wù)器發(fā)送的http請(qǐng)求頭中加入host字段信息
    #proxy_set_header $remote_addr;后端節(jié)點(diǎn)服務(wù)器日志獲取客戶端真實(shí)ip,否則全都是代理節(jié)點(diǎn)的ip
    #proyx_connect_timeout 30s;
    #proxy_buffers_size 4m;
    #xxx    
}
  xxxxx
}
與反向代理配置相關(guān)的更多參數(shù)

除了具有多虛擬主機(jī)代理以及節(jié)點(diǎn)服務(wù)器記錄真實(shí)用戶ip的功能外,Nginx還提供了相當(dāng)多的作為反向代理和后端節(jié)點(diǎn)服務(wù)器對(duì)話的相關(guān)控制參數(shù)。

由于參數(shù)眾多,建議把這些參數(shù)都寫到另外一個(gè)配置文件里,然后用 include 方式包含到虛擬主機(jī)配置文件里。其他Nginx參數(shù)也同樣可以使用此方法。

proxy.conf

proxy_set_header Host $host;
proxy_set_header $remote_addr;
proxy_connect_timeout 60s;
proxy_read_timeout 10s;
proxy_send_timeout 20s;
proxy_buffer_size 4m;
proxy_buffer_size 4 2m;
proxy_temp_file_write_size 2m;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404

virtual.conf

server {
  listen 80;
  server_name www.test.com www.xxx.com;
  location / {
    include /etc/nginx/proxy.conf;
  }
}

proxy_next_upstream參數(shù)補(bǔ)充

當(dāng)Nginx接收后端服務(wù)器發(fā)返回的proxy_next_upstream參數(shù)定義的狀態(tài)碼時(shí),會(huì)將這個(gè)請(qǐng)求轉(zhuǎn)發(fā)給正常工作的后端服務(wù)器,如500、502、503,此參數(shù)可以提升用戶訪問(wèn)體驗(yàn)。

proyx_next_upstream error timeout invalid_header http_500 http_503 http_502 http_504;


根據(jù)URL中的目錄地址實(shí)現(xiàn)代理轉(zhuǎn)發(fā)

根據(jù)URL中的目錄地址實(shí)現(xiàn)代理轉(zhuǎn)發(fā)說(shuō)明

通過(guò)Nginx實(shí)現(xiàn)動(dòng)靜分離,即通過(guò)Nginx反向代理配置規(guī)則實(shí)現(xiàn)讓動(dòng)態(tài)資源和靜態(tài)資源及其他業(yè)務(wù)分別由不同的服務(wù)器解析,已解決網(wǎng)站性能、安全、用戶體驗(yàn)等重要問(wèn)題。


動(dòng)靜態(tài)分離網(wǎng)站集群架構(gòu)


動(dòng)靜態(tài)分離配置文件

配置upstream.conf

upstream static {
  server 192.168.1.11;
  #或server static.com----hosts:static.com 192.168.1.11
}

upstream upload {
  server 192.168.1.22;
}

upstream default {
  server 192.168.1.33;
}


#在http中加入,注意位置
http {
  include upstream.conf;
}

配置virtual.conf

#方案1:利用location實(shí)現(xiàn)
location  /static/ {
  proyx_pass http://static;
  include proyx.conf;
}

location /upload/ {
  proxy_pass http://upload;
  include proxy.conf;
}

location / {
  proxy_pass http://default;
  include proxy.conf;
}

========================================
#方案2:利用if語(yǔ)句實(shí)現(xiàn)
if ($request_uri ~* "^/static/(.*)$")
{
      proxy_pass http://static/$1;
}

if ($request_uri ~* "^/upload/(.*)$")
{
    proxy_pass http://upload/$1;
}

location / {
  proxy_pass http://default;
  include  proyx.conf;
}


URL目錄地址轉(zhuǎn)發(fā)的應(yīng)用場(chǎng)景

根據(jù)HTTP的URL進(jìn)行轉(zhuǎn)發(fā)的應(yīng)用情況,被稱為 第7層(應(yīng)用層)的負(fù)載均衡;而LVS的負(fù)載均衡一般用于TCP等的轉(zhuǎn)發(fā),因此被稱為第四層(傳輸層)的負(fù)載均衡

有時(shí)因?yàn)樾枨螅枰诖矸?wù)器上通過(guò)配置規(guī)則,使得匹配不同規(guī)則的請(qǐng)求會(huì)交給不同的服務(wù)器池處理。


根據(jù)客戶端的設(shè)備(user_agent)轉(zhuǎn)發(fā)

為了讓不同客戶端設(shè)備用戶有更好的訪問(wèn)體驗(yàn),需要在后端架設(shè)不同服務(wù)器來(lái)滿足不同的客戶端訪問(wèn)。如PC端和移動(dòng)端,移動(dòng)端又有安卓、蘋果、Pad等。

1. 常規(guī)4層負(fù)載均衡解決方案架構(gòu)
在常規(guī)4層負(fù)載均衡架構(gòu)下,可以使用不同的域名來(lái)實(shí)現(xiàn)這個(gè)需求。
如,分配移動(dòng)端訪問(wèn) wap.xxx.com,PC端訪問(wèn)www.xxx.com
通過(guò)不同域名來(lái)引導(dǎo)用戶到指定后端服務(wù)器,但是這樣就分別得記住不同的域名。

2. 第7層負(fù)載均衡解決方案
在7層負(fù)載均衡架構(gòu)下,對(duì)外只需要用一個(gè)域名,如www.xxx.com,然后通過(guò)獲取用戶請(qǐng)求中的設(shè)備信息$http_user_agent,根據(jù)此信息轉(zhuǎn)給后端合適的服務(wù)器處理。

根據(jù)$user_agent轉(zhuǎn)發(fā)配置

栗子:

location / {
  if ($http_user_agent ~* "android")
      {
          proxy_pass http://android;
      }

if ($http_user_agent ~* "iphone")
      {
          proxy_pass http://iphone;
      }
proxy_pass http://default;
include proyx.conf;


根據(jù)文件擴(kuò)展名實(shí)現(xiàn)代理轉(zhuǎn)發(fā)

栗子:

#locaiton
location ~*  .*\.(gif|jpg|png|css|js)$ {
  proyx_pass http://static;
  include proxy.conf;
}

#if
if ($request_uri ~* ".*\.php$")
  {
      proxy_pass http://php;
  }
if ($request_uri ~* ".*\.(jpg|png|css|js)$")
  {
      proxy_pass http://static;
  }

在開(kāi)發(fā)無(wú)法通過(guò)程序?qū)崿F(xiàn)動(dòng)靜分離的時(shí)候,運(yùn)維可以根據(jù)資源實(shí)體進(jìn)行動(dòng)靜分離,根據(jù)不同實(shí)現(xiàn)策略制定后端服務(wù)器不同的組。在前端代理服務(wù)器上通過(guò)路徑、擴(kuò)展名等進(jìn)行規(guī)則匹配,從而實(shí)現(xiàn)請(qǐng)求的動(dòng)態(tài)分離。




Nginx負(fù)載均衡檢測(cè)節(jié)點(diǎn)狀態(tài)

淘寶技術(shù)團(tuán)隊(duì)開(kāi)發(fā)了一個(gè)Tengine(Nginx分支)模塊nginx_upstream_check_module
https://github.com/yaoweibin/nginx_upstream_check_module,用于提供主動(dòng)式后端服務(wù)器健康檢查。
通過(guò)它檢測(cè)后端realserver的健康狀態(tài),如果后端節(jié)點(diǎn)不可用,則所有的請(qǐng)求就不會(huì)轉(zhuǎn)發(fā)到該節(jié)點(diǎn)上。

Nginx需要通過(guò)打補(bǔ)丁的方式將該模塊添加進(jìn)去。源碼安裝才行的哈。

安裝:

wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master
unzip master
cd nginx_upstream_check_module-master    #解壓后的文件夾

cd  nginx源碼安裝包(我是 /usr/local/nginx-1.12.1)
patch -p1 < ../nginx_upstream_check_module-master/check_1.12.1+.patch    #選擇對(duì)應(yīng)的Nginx版本號(hào),我的是1.12.1    #打補(bǔ)丁

#編譯,注意以前的編譯參數(shù)
./configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-pcre \
--add-module=../nginx_upstream_check_module-master

make    
#給已經(jīng)安裝的Nginx系統(tǒng)打補(bǔ)丁不用執(zhí)行make install
#make是重新生成Nginx二進(jìn)制啟動(dòng)命令

#備份
mv /usr/local/nginx/sbin/nginx{,.bak}

#經(jīng)打過(guò)補(bǔ)丁的Nginx二進(jìn)制程序復(fù)制到/usr/local/nginx/sbin/ 下
cp /usr/local/nginx-1.12.1/objs/nginx /usr/local/nginx/sbin/

nginx -t

配置nginx_upstream_check

配置upstream.conf:

upstream zhang {
    server 192.168.1.7:5678 weight=1;
    server 192.168.0.99:5678 weight=1;
    check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    #每個(gè)3秒對(duì)負(fù)載均衡中所有節(jié)點(diǎn)檢測(cè)一次,請(qǐng)求2次正常標(biāo)記realserver狀態(tài)為up;
    #如果檢測(cè)5次都失敗,則標(biāo)記realserver狀態(tài)為down,超時(shí)時(shí)間為1秒;
    #檢查的協(xié)議為HTTP;
}

配置/status:

location /status {
    check_status;
    access_log off;
    allow 192.168.1.0/24;
    deny all;
        }

效果圖:

效果圖

而我的前端節(jié)點(diǎn)中 check interval=3000 rise=2 fall=5 timeout=1000 type=http; 這個(gè)使用的話,我的upstream無(wú)法生效,注釋后就沒(méi)問(wèn)題。
不知道是不是因?yàn)槲业膗pstream后端節(jié)點(diǎn)是通過(guò)yum安裝的nginx,沒(méi)有安裝http_upstream_check_module。
所以此處我的Status是down。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。