Nginx的反向代理與負(fù)載均衡
什么是反向代理?
自己計(jì)算機(jī) A 想訪(fǎng)問(wèn)國(guó)外某個(gè)網(wǎng)站 B围段,很遺憾訪(fǎng)問(wèn)不了亏栈;此時(shí)台腥,有臺(tái)中間服務(wù)器 C 可以訪(fǎng)問(wèn)國(guó)外的網(wǎng)站B,那么绒北,我們可以用自己的計(jì)算機(jī) A 訪(fǎng)問(wèn) 服務(wù)器C黎侈, 通過(guò)C來(lái)訪(fǎng)問(wèn)B網(wǎng)站。那么這個(gè)時(shí)候闷游, 服務(wù)器C稱(chēng)為代理服務(wù)器峻汉,這種訪(fǎng)問(wèn)方式叫做正向代理。正向代理有一個(gè)特點(diǎn)脐往,就是我們明確知道要訪(fǎng)問(wèn)哪個(gè)網(wǎng)站休吠。
再如,當(dāng)我們有一個(gè)服務(wù)器集中业簿,并且服務(wù)器集群中的每臺(tái)服務(wù)器的內(nèi)容一樣的時(shí)候瘤礁,同樣我們要直接從個(gè)人電腦訪(fǎng)問(wèn)到服務(wù)器集中的服務(wù)器的時(shí)候無(wú)法訪(fǎng)問(wèn),且此時(shí)第三方服務(wù)器能訪(fǎng)問(wèn)集群辖源,這個(gè)時(shí)候,我們通過(guò)第三方服務(wù)器訪(fǎng)問(wèn)服務(wù)器集群的內(nèi)容希太,但是此時(shí)我們并不知道是哪一臺(tái)服務(wù)器提供的內(nèi)容克饶,此時(shí)的代理方式稱(chēng)為反向代理。
什么是負(fù)載均衡
Nginx 是一款可以通過(guò)反向代理實(shí)現(xiàn)負(fù)載均衡的服務(wù)器誊辉,使用Nginx服務(wù)器實(shí)現(xiàn)負(fù)載均衡的時(shí)候矾湃,用戶(hù)的訪(fǎng)問(wèn)首先會(huì)訪(fǎng)問(wèn)到Nginx服務(wù)器,然后Nginx服務(wù)器再?gòu)姆?wù)器集群表中選擇壓力較小的服務(wù)器堕澄,然后將該訪(fǎng)問(wèn)請(qǐng)求引向該服務(wù)器邀跃。
若服務(wù)器集群中的某個(gè)服務(wù)器崩潰霉咨,那么從待選服務(wù)器列表中將該服務(wù)器刪除,也就是說(shuō)一個(gè)服務(wù)器假如崩潰了拍屑,那么Nginx就肯定不會(huì)將訪(fǎng)問(wèn)請(qǐng)求引入該服務(wù)器了途戒。
負(fù)載均衡實(shí)現(xiàn)
HTTP Upstram 模塊
Upstream模塊是Nginx服務(wù)器的一個(gè)重要模塊。 Upstream模塊實(shí)現(xiàn)在輪詢(xún)和客戶(hù)端ip之間實(shí)現(xiàn)后端的負(fù)載均衡僵驰。常用的指令有 ip_hash
指令喷斋、server
指令 和 upstream
指令等。
-
ip_hash
沒(méi)有默認(rèn)值蒜茴。 基于客戶(hù)端的IP地址分發(fā)請(qǐng)求星爪。- 哈希的關(guān)鍵字是客戶(hù)端的C類(lèi)網(wǎng)絡(luò)地址,這個(gè)功能將保證這個(gè)客戶(hù)端請(qǐng)求總是被轉(zhuǎn)發(fā)到一臺(tái)服務(wù)器上粉私,但是如果這臺(tái)服務(wù)器不可用顽腾,那么請(qǐng)求將轉(zhuǎn)發(fā)到另外的服務(wù)器上,這將保證某個(gè)客戶(hù)端有很大概率總是連接到一臺(tái)服務(wù)器诺核。
- 語(yǔ)法:"ip_hash;"
- 無(wú)法將權(quán)重(weight)與ip_hash聯(lián)合使用來(lái)分發(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ù)器的名稱(chēng)和一些參數(shù)憎瘸,可以使用域名,IP陈瘦,端口幌甘,或者unix socket。如果指定為域名痊项,則首先將其解析為IP锅风。-
語(yǔ)法:
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í)間沒(méi)有直接關(guān)系,不過(guò)可以使用proxy_connect_timeout
和proxy_read_timeout
來(lái)控制睦刃。 -
down
- 標(biāo)記服務(wù)器處于離線(xiàn)狀態(tài)砚嘴,通常和ip_hash
一起使用。 -
backup
- (0.6.7或更高)如果所有的非備份服務(wù)器都宕機(jī)或繁忙,則使用本服務(wù)器(無(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ù)器翅娶。
-
語(yǔ)法:
-
upstream
這個(gè)字段設(shè)置一群服務(wù)器文留,可以將這個(gè)字段放在proxy_pass
和fastcgi_pass
指令中作為一個(gè)單獨(dú)的實(shí)體,它們可以可以是監(jiān)聽(tīng)不同端口的服務(wù)器竭沫,并且也可以是同時(shí)監(jiān)聽(tīng)TCP
和Unix socket
的服務(wù)器燥翅。服務(wù)器可以指定不同的權(quán)重,默認(rèn)為1蜕提。-
語(yǔ)法:
upstream name { ... }
- 使用如上 代碼片段
- 請(qǐng)求將按照輪詢(xún)的方式分發(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ù)器檢查都通過(guò)。如果所有的服務(wù)器都無(wú)法通過(guò)檢查须喂,那么將返回給客戶(hù)端最后一臺(tái)工作的服務(wù)器產(chǎn)生的結(jié)果吁断。
-
語(yǔ)法:
一些 Nginx 的命令
- nginx -s reload 重新加載Nginx
- nginx -s stop 關(guān)閉nginx
- nginx -s start 開(kāi)啟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)的成本也非常高。
- 如果采用軟件的方式來(lái)實(shí)現(xiàn)負(fù)載均衡是己,那么中間的轉(zhuǎn)發(fā)機(jī)構(gòu)就是軟件又兵,這個(gè)時(shí)候,運(yùn)行效率不如硬件卒废,但是成本相對(duì)來(lái)說(shuō)低得多沛厨。
- Nginx服務(wù)器實(shí)現(xiàn)負(fù)載均衡,那么就是通過(guò)軟件的方式來(lái)實(shí)現(xiàn)負(fù)載均衡摔认,并且Nginx本身支持高并發(fā)等逆皮。顧而使用Nginx服務(wù)器實(shí)現(xiàn)負(fù)載均衡,能大大解決節(jié)約企業(yè)的成本级野,并且由于Nginx是服務(wù)器軟件页屠,且執(zhí)行效率也非常高