Nginx的反向代理與負(fù)載均衡
什么是反向代理?
自己計(jì)算機(jī) A 想訪問國外某個(gè)網(wǎng)站 B,很遺憾訪問不了;此時(shí),有臺(tái)中間服務(wù)器 C 可以訪問國外的網(wǎng)站B,那么,我們可以用自己的計(jì)算機(jī) A 訪問 服務(wù)器C, 通過C來訪問B網(wǎng)站。那么這個(gè)時(shí)候, 服務(wù)器C稱為代理服務(wù)器,這種訪問方式叫做正向代理。正向代理有一個(gè)特點(diǎn),就是我們明確知道要訪問哪個(gè)網(wǎng)站。
再如,當(dāng)我們有一個(gè)服務(wù)器集中,并且服務(wù)器集群中的每臺(tái)服務(wù)器的內(nèi)容一樣的時(shí)候,同樣我們要直接從個(gè)人電腦訪問到服務(wù)器集中的服務(wù)器的時(shí)候無法訪問,且此時(shí)第三方服務(wù)器能訪問集群,這個(gè)時(shí)候,我們通過第三方服務(wù)器訪問服務(wù)器集群的內(nèi)容,但是此時(shí)我們并不知道是哪一臺(tái)服務(wù)器提供的內(nèi)容,此時(shí)的代理方式稱為反向代理。
什么是負(fù)載均衡
Nginx 是一款可以通過反向代理實(shí)現(xiàn)負(fù)載均衡的服務(wù)器,使用Nginx服務(wù)器實(shí)現(xiàn)負(fù)載均衡的時(shí)候,用戶的訪問首先會(huì)訪問到Nginx服務(wù)器,然后Nginx服務(wù)器再從服務(wù)器集群表中選擇壓力較小的服務(wù)器,然后將該訪問請(qǐng)求引向該服務(wù)器。
若服務(wù)器集群中的某個(gè)服務(wù)器崩潰,那么從待選服務(wù)器列表中將該服務(wù)器刪除,也就是說一個(gè)服務(wù)器假如崩潰了,那么Nginx就肯定不會(huì)將訪問請(qǐng)求引入該服務(wù)器了。
負(fù)載均衡實(shí)現(xiàn)



HTTP Upstram 模塊
Upstream模塊是Nginx服務(wù)器的一個(gè)重要模塊。 Upstream模塊實(shí)現(xiàn)在輪詢和客戶端ip之間實(shí)現(xiàn)后端的負(fù)載均衡。常用的指令有 ip_hash指令、server指令 和 upstream指令等。
-
ip_hash沒有默認(rèn)值。 基于客戶端的IP地址分發(fā)請(qǐng)求。- 哈希的關(guān)鍵字是客戶端的C類網(wǎng)絡(luò)地址,這個(gè)功能將保證這個(gè)客戶端請(qǐng)求總是被轉(zhuǎn)發(fā)到一臺(tái)服務(wù)器上,但是如果這臺(tái)服務(wù)器不可用,那么請(qǐng)求將轉(zhuǎn)發(fā)到另外的服務(wù)器上,這將保證某個(gè)客戶端有很大概率總是連接到一臺(tái)服務(wù)器。
- 語法:"ip_hash;"
- 無法將權(quán)重(weight)與ip_hash聯(lián)合使用來分發(fā)連接。如果有某臺(tái)服務(wù)器不可用,你必須標(biāo)記其為“down”,如下例:
upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com down; server backend4.example.com; }
-
server指定后端服務(wù)器的名稱和一些參數(shù),可以使用域名,IP,端口,或者unix socket。如果指定為域名,則首先將其解析為IP。-
語法:
server name [parameters] -
weight=NUMBER- 設(shè)置服務(wù)器權(quán)重,默認(rèn)為1。 -
max_fails=NUMBER- 在一定時(shí)間內(nèi)(這個(gè)時(shí)間在fail_timeout參數(shù)中設(shè)置)檢查這個(gè)服務(wù)器是否可用時(shí)產(chǎn)生的最多失敗請(qǐng)求數(shù),默認(rèn)為1,將其設(shè)置為0可以關(guān)閉檢查,這些錯(cuò)誤在proxy_next_upstream或fastcgi_next_upstream(404錯(cuò)誤不會(huì)使max_fails增加)中定義。 -
fail_timeout=TIME- 在這個(gè)時(shí)間內(nèi)產(chǎn)生了max_fails所設(shè)置大小的失敗嘗試連接請(qǐng)求后這個(gè)服務(wù)器可能不可用,同樣它指定了服務(wù)器不可用的時(shí)間(在下一次嘗試連接請(qǐng)求發(fā)起之前),默認(rèn)為10秒,fail_timeout與前端響應(yīng)時(shí)間沒有直接關(guān)系,不過可以使用proxy_connect_timeout和proxy_read_timeout來控制。 -
down- 標(biāo)記服務(wù)器處于離線狀態(tài),通常和ip_hash一起使用。 -
backup- (0.6.7或更高)如果所有的非備份服務(wù)器都宕機(jī)或繁忙,則使用本服務(wù)器(無法和ip_hash指令搭配使用)。
upstream backend { server backend1.example.com weight=5; server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; }注意:如果你只使用一臺(tái)上游服務(wù)器,nginx將設(shè)置一個(gè)內(nèi)置變量為1,即max_fails和fail_timeout參數(shù)不會(huì)被處理。
結(jié)果:如果nginx不能連接到上游,請(qǐng)求將丟失。
解決:使用多臺(tái)上游服務(wù)器。
-
語法:
-
upstream這個(gè)字段設(shè)置一群服務(wù)器,可以將這個(gè)字段放在proxy_pass和fastcgi_pass指令中作為一個(gè)單獨(dú)的實(shí)體,它們可以可以是監(jiān)聽不同端口的服務(wù)器,并且也可以是同時(shí)監(jiān)聽TCP和Unix socket的服務(wù)器。服務(wù)器可以指定不同的權(quán)重,默認(rèn)為1。-
語法:
upstream name { ... } - 使用如上 代碼片段
- 請(qǐng)求將按照輪詢的方式分發(fā)到后端服務(wù)器,但同時(shí)也會(huì)考慮權(quán)重。
- 在上面的例子中如果每次發(fā)生7個(gè)請(qǐng)求,5個(gè)請(qǐng)求將被發(fā)送到backend1.example.com,其他兩臺(tái)將分別得到一個(gè)請(qǐng)求,如果有一臺(tái)服務(wù)器不可用,那么請(qǐng)求將被轉(zhuǎn)發(fā)到下一臺(tái)服務(wù)器,直到所有的服務(wù)器檢查都通過。如果所有的服務(wù)器都無法通過檢查,那么將返回給客戶端最后一臺(tái)工作的服務(wù)器產(chǎn)生的結(jié)果。
-
語法:
一些 Nginx 的命令
- nginx -s reload 重新加載Nginx
- nginx -s stop 關(guān)閉nginx
- nginx -s start 開啟nginx
- service nginx start/stop/restart (這個(gè)一般我用的比較多)
- nginx -t -c 文件地址 驗(yàn)證配置文件
總結(jié)
- 使用硬件的方式實(shí)現(xiàn)負(fù)載均衡,那么中間的轉(zhuǎn)發(fā)機(jī)構(gòu)就是硬件,這個(gè)時(shí)候運(yùn)行的效率非常高,對(duì)應(yīng)的成本也非常高。
- 如果采用軟件的方式來實(shí)現(xiàn)負(fù)載均衡,那么中間的轉(zhuǎn)發(fā)機(jī)構(gòu)就是軟件,這個(gè)時(shí)候,運(yùn)行效率不如硬件,但是成本相對(duì)來說低得多。
- Nginx服務(wù)器實(shí)現(xiàn)負(fù)載均衡,那么就是通過軟件的方式來實(shí)現(xiàn)負(fù)載均衡,并且Nginx本身支持高并發(fā)等。顧而使用Nginx服務(wù)器實(shí)現(xiàn)負(fù)載均衡,能大大解決節(jié)約企業(yè)的成本,并且由于Nginx是服務(wù)器軟件,且執(zhí)行效率也非常高