來(lái)源:北大青鳥(niǎo)總部 2023年06月19日 15:00
如果說(shuō)有一款工具是互聯(lián)網(wǎng)公司必備的,那一定是Nginx,作為一款優(yōu)秀的開(kāi)源web服務(wù)器軟件,因?yàn)樾阅芊€(wěn)定、適合多個(gè)場(chǎng)景、使用簡(jiǎn)單等優(yōu)點(diǎn),在各互聯(lián)網(wǎng)公司,大到上萬(wàn)人的阿里京東騰訊頭條滴滴美團(tuán),小到幾十百人的創(chuàng)業(yè)團(tuán)隊(duì),從研發(fā)都運(yùn)維,它都是最炙手可熱的。在web服務(wù)應(yīng)用中,它可以實(shí)現(xiàn)靜態(tài)資源、PHP等網(wǎng)站的搭建;在后端代理服務(wù)中,它支持tcp/udp、http、grpc、fastcgi(PHP語(yǔ)言使用的協(xié)議)等協(xié)議的轉(zhuǎn)發(fā)處理;在緩存場(chǎng)景中,它自身可以緩存歷史數(shù)據(jù);在API網(wǎng)關(guān)應(yīng)用中,它提供了身份認(rèn)證、鑒權(quán)等操作。在云計(jì)算、大數(shù)據(jù)的海量高并發(fā)場(chǎng)景下,更是需要Nginx來(lái)協(xié)同工作。
簡(jiǎn)單的介紹了Nginx的功能后,我們來(lái)看看Nginx背后的架構(gòu)是怎么樣的?它是如何進(jìn)行設(shè)計(jì)的?在Nginx的架構(gòu)中包含master節(jié)點(diǎn)、worker節(jié)點(diǎn)、緩存、第三方(web服務(wù)器、應(yīng)用服務(wù)器)。Nginx啟動(dòng)之后,前端每傳來(lái)一個(gè)用戶請(qǐng)求,master主進(jìn)程都會(huì)生成一個(gè)子進(jìn)程worker去進(jìn)行處理,worker負(fù)責(zé)監(jiān)聽(tīng)事件,處理任務(wù),比如將請(qǐng)求基于http等通信協(xié)議轉(zhuǎn)發(fā)給webserver。在nginx啟動(dòng)的同時(shí),會(huì)開(kāi)啟緩存功能,創(chuàng)建cacheloader進(jìn)程,cacheloader進(jìn)程將磁盤(pán)緩存的對(duì)象加載在內(nèi)存當(dāng)中,供nginx使用。此外Nginx采用異步非阻塞通信模式,即進(jìn)程接收到請(qǐng)求之后,客戶端不用等待響應(yīng),可以去處理其它任務(wù),等待操作完成之后再將數(shù)據(jù)返回給到客戶端。
此外,Nginx的邏輯架構(gòu)設(shè)計(jì)還采用了當(dāng)下最流行的設(shè)計(jì)思想,即基于事件驅(qū)動(dòng)。在Nginx的整個(gè)邏輯架構(gòu)中,包含核心模塊、http模塊、配置模塊、第三方模塊等,核心模塊處理Nginx的核心任務(wù),如進(jìn)程管理、權(quán)限控制,http模塊處理http任務(wù),如與第三方進(jìn)行通信,第三方模塊提供Nginx的擴(kuò)展功能,開(kāi)發(fā)者可以根據(jù)自己需求進(jìn)行二次開(kāi)發(fā)。
介紹完了Nginx的架構(gòu)之后,我們來(lái)看看Nginx的使用用途。因?yàn)镹ginx非常的強(qiáng)大,它的用途自然也非常的廣,而當(dāng)下最熱門(mén)的技術(shù)理念莫過(guò)于DevOps,最熱的事件莫過(guò)于雙十一大促春節(jié)搶票了,那我們就從這兩個(gè)場(chǎng)景來(lái)進(jìn)行講解吧。
DevOps理念倡導(dǎo)的是微服務(wù)模式,快速開(kāi)發(fā),快速迭代,持續(xù)集成,持續(xù)交付。也就是說(shuō)會(huì)隨著業(yè)務(wù)的不斷擴(kuò)展,衍生出很多的新業(yè)務(wù),并且會(huì)拆分的非常原子化,由不同團(tuán)隊(duì)負(fù)責(zé)不同模塊的開(kāi)發(fā)與上線。對(duì)于大公司來(lái)說(shuō),如果技術(shù)體系成熟,順其自然的拆分微服務(wù)架構(gòu)即可,但對(duì)于技術(shù)體系不成熟或歷史包袱比較重的公司,基于Nginx也可以很好的實(shí)現(xiàn)DevOps。如下圖所示,業(yè)務(wù)拆分成了電影、酒店、商超、旅游部分,通過(guò)Redis將不同業(yè)務(wù)的key存儲(chǔ)起來(lái),用戶請(qǐng)求來(lái)了之后,經(jīng)過(guò)Nginx負(fù)載均衡去請(qǐng)求不同業(yè)務(wù)的ID,再把請(qǐng)求做轉(zhuǎn)發(fā),如果再有新的業(yè)務(wù)擴(kuò)展,在redis中增加一條記錄即可。
雙十一大促和春運(yùn)都面臨的一個(gè)問(wèn)題是海量請(qǐng)求高并發(fā),雙十一是很多人搶東西,春運(yùn)是很多人搶票,當(dāng)請(qǐng)求突然爆發(fā)性的增長(zhǎng)時(shí),如果沒(méi)有應(yīng)急措施,很有可能會(huì)造成服務(wù)癱瘓,業(yè)務(wù)不可用。作為技術(shù)部門(mén)的研發(fā)運(yùn)維都必須要保證服務(wù)的高可用,借助Nginx,當(dāng)業(yè)務(wù)請(qǐng)求量正常時(shí),訪問(wèn)正常業(yè)務(wù)集群,同時(shí)也把數(shù)據(jù)備份到降級(jí)集群中,當(dāng)業(yè)務(wù)訪問(wèn)量異常發(fā)生故障時(shí),通過(guò)Nginx將業(yè)務(wù)切到降級(jí)集群,恢復(fù)之后再把用戶切回,簡(jiǎn)簡(jiǎn)單單的保證了業(yè)務(wù)的高可用。
除了上述兩個(gè)最應(yīng)景的場(chǎng)景之外,其實(shí)Nginx還可以用來(lái)做運(yùn)營(yíng)運(yùn)維數(shù)據(jù)的統(tǒng)計(jì)分析。你想想看啊,所有的請(qǐng)求都是通過(guò)Nginx的入口轉(zhuǎn)發(fā)的,那自然可以統(tǒng)計(jì)到用戶最長(zhǎng)訪問(wèn)的URL、接口,進(jìn)而可以獲取到用戶最長(zhǎng)訪問(wèn)的服務(wù)、業(yè)務(wù)、模塊,根據(jù)訪問(wèn)量、請(qǐng)求量來(lái)做對(duì)應(yīng)模塊的性能優(yōu)化與業(yè)務(wù)運(yùn)維了。所以你也可以看到,不只是前端可以獲取用戶訪問(wèn)數(shù)據(jù),后端也是可以獲取的喲。
通過(guò)本文,相信大家對(duì)Nginx已經(jīng)有了比較清楚的了解了,高并發(fā)、性能好、用途廣,難怪滴滴美團(tuán)阿里頭條內(nèi)部各業(yè)務(wù)線各技術(shù)部門(mén)都紛紛使用,青睞有加呢,在中小型創(chuàng)業(yè)公司它的使用也不賴噢。此外。如果你的業(yè)務(wù)正在遭遇高并發(fā)崩潰問(wèn)題,抑或是正面臨技術(shù)架構(gòu)轉(zhuǎn)型,微服務(wù)落地,devops實(shí)踐等問(wèn)題,那么你不妨考慮使用Nginx。它真的很簡(jiǎn)單,也真的很好用。對(duì)于加入互聯(lián)網(wǎng)公司的研發(fā)運(yùn)維人員,熟練掌握Nginx也是一門(mén)技巧噢。