一、簡(jiǎn)介
nginx是一個(gè)輕量級(jí)的http和反向代理服務(wù)器允悦,占用內(nèi)存少,并發(fā)能力強(qiáng)溅呢。
二澡屡、相關(guān)概念
正向代理
程序要去訪問一個(gè)地址,不直接訪問咐旧,而是向一個(gè)代理服務(wù)器發(fā)送一個(gè)請(qǐng)求并指定目標(biāo)地址驶鹉,代理服務(wù)器訪問目標(biāo)地址,然后將結(jié)果返回給程序铣墨,資源服務(wù)就是程序指定的服務(wù)室埋。例如代碼里請(qǐng)求時(shí),設(shè)置proxy;瀏覽器配置fiddler代理等姚淆。
反向代理
程序訪問代理服務(wù)孕蝉,代理服務(wù)可能自己沒有資源,將請(qǐng)求轉(zhuǎn)給另一個(gè)服務(wù)腌逢,然后將取到的結(jié)果返回給原程序降淮,資源服務(wù)對(duì)于原程序來說是不可知的。
動(dòng)靜分離
將動(dòng)態(tài)資源和靜態(tài)資源分開存放搏讶,放到不同的服務(wù)器佳鳖,這樣就方便對(duì)靜態(tài)資源做一些緩存。通過location將不同的資源請(qǐng)求轉(zhuǎn)發(fā)到不同的服務(wù)媒惕,通過expires參數(shù)讓瀏覽器進(jìn)行緩存系吩。
負(fù)載均衡
負(fù)載均衡就是把任務(wù)分?jǐn)偟綆讉€(gè)服務(wù)上去執(zhí)行。有以下集中方式:
- 輪詢(默認(rèn))
- 按權(quán)重妒蔚。upstream可配置權(quán)重穿挨。
- ip_hash。每個(gè)請(qǐng)求按訪問 ip 的 的 hash 結(jié)果分配肴盏,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器科盛。
- fair(第三方)。按后端服務(wù)器的響應(yīng)時(shí)間來分配請(qǐng)求叁鉴,響應(yīng)時(shí)間短的優(yōu)先分配土涝。
三、高可用集群
高可用集群是基于keepalived實(shí)現(xiàn)的幌墓,架構(gòu)圖:
什么是keepalived但壮?
keepalived的作用一個(gè)是對(duì)外提供一個(gè)虛擬ip(VIP)讓調(diào)用方訪問,另一個(gè)是心跳檢測(cè)常侣,監(jiān)測(cè)服務(wù)(如nginx)是不是掛了蜡饵。他是基于協(xié)議VRRP(Virtual Router Redundancy Protocol,即虛擬路由冗余協(xié)議)來實(shí)現(xiàn)的:
VRRP協(xié)議將兩臺(tái)或多臺(tái)路由器設(shè)備虛擬成一個(gè)設(shè)備胳施,對(duì)外提供虛擬路由器IP(一個(gè)或多個(gè))溯祸。然而,在路由器組內(nèi)部舞肆,如果實(shí)際擁有這個(gè)對(duì)外IP的路由器如果工作正常的話焦辅,就是master,或者是通過算法選舉產(chǎn)生的椿胯,MASTER實(shí)現(xiàn)針對(duì)虛擬路由器IP的各種網(wǎng)絡(luò)功能筷登,如ARP請(qǐng)求,ICMP哩盲,以及數(shù)據(jù)的轉(zhuǎn)發(fā)等前方,其他設(shè)備不具有該IP狈醉,狀態(tài)是BACKUP。除了接收MASTER的VRRP狀態(tài)通告信息外惠险,不執(zhí)行對(duì)外的網(wǎng)絡(luò)功能苗傅,當(dāng)主級(jí)失效時(shí),BACKUP將接管原先MASTER的網(wǎng)絡(luò)功能班巩。
VRRP協(xié)議配置時(shí)渣慕,需要配置每個(gè)路由器的虛擬路由ID(VRID)和優(yōu)先權(quán)值,使用VRID將路由器進(jìn)行分組趣竣,具有相同VRID值的路由器為同一個(gè)組摇庙,VRID是一個(gè)0-255的整數(shù)旱物;同一個(gè)組中的路由器通過使用優(yōu)先權(quán)值來選舉MASTER遥缕。優(yōu)先權(quán)大者為MASTER,優(yōu)先權(quán)也是一個(gè)0-255的正整數(shù)宵呛。
keepalived工作原理
keepalived可提供vrrp以及health-check功能单匣,可以只用它提供雙機(jī)浮動(dòng)的vip(vrrp虛擬路由功能),這樣可以簡(jiǎn)單實(shí)現(xiàn)一個(gè)雙機(jī)熱備高可用功能宝穗;keepalived是以VRRP虛擬路由冗余協(xié)議為基礎(chǔ)實(shí)現(xiàn)高可用的户秤,可以認(rèn)為是實(shí)現(xiàn)路由器高可用的協(xié)議,即將N臺(tái)提供相同功能的路由器組成一個(gè)路由器組逮矛,這個(gè)組里面有一個(gè)master和多個(gè)backup鸡号,master上面有一個(gè)對(duì)外提供服務(wù)的vip(該路由器所在局域網(wǎng)內(nèi)其他機(jī)器的默認(rèn)路由為該vip),master會(huì)發(fā)組播须鼎,當(dāng)backup收不到VRRP包時(shí)就認(rèn)為master宕掉了鲸伴,這時(shí)就需要根據(jù)VRRP的優(yōu)先級(jí)來選舉一個(gè)backup當(dāng)master。這樣的話就可以保證路由器的高可用了晋控。
四汞窗、多進(jìn)程工作模型
從上圖中可以很明顯地看到,4個(gè)worker進(jìn)程的父進(jìn)程都是master進(jìn)程赡译,表明worker進(jìn)程都是從父進(jìn)程fork出來的仲吏,并且父進(jìn)程的ppid為1,表示其為daemon進(jìn)程蝌焚。
需要說明的是裹唆,在nginx多進(jìn)程中,每個(gè)worker都是平等的只洒,因此每個(gè)進(jìn)程處理外部請(qǐng)求的機(jī)會(huì)權(quán)重都是一致的许帐。
Master進(jìn)程的作用是?
讀取并驗(yàn)證配置文件nginx.conf红碑;管理worker進(jìn)程舞吭;
Worker進(jìn)程的作用是泡垃?
每一個(gè)Worker進(jìn)程都維護(hù)一個(gè)線程(避免線程切換),處理連接和請(qǐng)求羡鸥;注意Worker進(jìn)程的個(gè)數(shù)由配置文件決定蔑穴,一般和CPU個(gè)數(shù)相關(guān)(有利于進(jìn)程切換),配置幾個(gè)就有幾個(gè)Worker進(jìn)程惧浴。
Nginx如何做到熱部署存和?
所謂熱部署,就是配置文件nginx.conf修改后衷旅,不需要stop nginx捐腿,不需要中斷請(qǐng)求,就能讓配置文件生效J炼ァ(nginx -s reload 重新加載/nginx -t檢查配置/nginx -s stop)
修改配置文件nginx.conf后茄袖,重新生成新的worker進(jìn)程,當(dāng)然會(huì)以新的配置進(jìn)行處理請(qǐng)求嘁锯,而且新的請(qǐng)求必須都交給新的worker進(jìn)程宪祥,至于老的worker進(jìn)程,等把那些以前的請(qǐng)求處理完畢后家乘,kill掉即可蝗羊。
Nginx如何做到高并發(fā)下的高效處理?
Nginx采用了Linux的epoll模型仁锯,epoll模型基于事件驅(qū)動(dòng)機(jī)制耀找,它可以監(jiān)控多個(gè)事件是否準(zhǔn)備完畢,如果OK业崖,那么放入epoll隊(duì)列中野芒,這個(gè)過程是異步的。worker只需要從epoll隊(duì)列循環(huán)處理即可腻要。
連接數(shù)worker_connection
worker_connection是一個(gè)worker支持的最大并發(fā)連接數(shù)复罐。
瀏覽器發(fā)送1個(gè)請(qǐng)求,如果是請(qǐng)求靜態(tài)資源雄家,那就占用1個(gè)連接效诅。如果是要反向代理的,那就占用2個(gè)趟济。有時(shí)候?yàn)g覽器一個(gè)接口會(huì)發(fā)送2次請(qǐng)求(第一次option)乱投,那就是占用4個(gè)連接了。
nginx支持的最大并發(fā)數(shù):
普通的靜態(tài)訪問最大并發(fā)數(shù)是: worker_connections * worker_processes / 2
如果作為反向代理:worker_connections * worker_processes / 4
參考資料
Nginx篇——語雀
Keepalived基礎(chǔ)知識(shí)詳細(xì)完整總結(jié)
通俗易懂的Nginx工作原理