Nginx 在運(yùn)維領(lǐng)域中的應(yīng)用,看這一篇就夠了
關(guān)于 Nginx
Nginx 已誕生十余年,其作為一款開源的 Web 服務(wù)器軟件,因其具有性能穩(wěn)定、高并發(fā)、低內(nèi)存耗用、高性能的處理能力等特點(diǎn),被廣泛應(yīng)用到國內(nèi)外各互聯(lián)網(wǎng)廠商的實(shí)際生產(chǎn)架構(gòu)中。其主要有如下場景應(yīng)用:
- Web 服務(wù)應(yīng)用,可實(shí)現(xiàn)靜態(tài)資源、PHP、Python 等網(wǎng)站的架設(shè)
- 代理負(fù)載服務(wù),支持 TCP/UDP、HTTP、HTTP/2、gRPC、FastCGI、SCGI、uWSGI 等協(xié)議的轉(zhuǎn)發(fā)處理,并實(shí)現(xiàn)了相應(yīng)通信協(xié)議的請(qǐng)求解析、長連接、代理轉(zhuǎn)發(fā)、負(fù)載均衡、會(huì)話保持等互聯(lián)網(wǎng)架構(gòu)中常見的應(yīng)用功能
- 緩存應(yīng)用,基于其代理功能,實(shí)現(xiàn)正向或反向代理緩存功能
- API 網(wǎng)關(guān)應(yīng)用,其提供了包括身份認(rèn)證、路由轉(zhuǎn)發(fā)、更基于支持 Lua 語言腳本模塊擴(kuò)展的可編程能力,使其可用于各種復(fù)雜環(huán)境的路由處理
Nginx 基于事件驅(qū)動(dòng)架構(gòu),具有可支持?jǐn)?shù)百萬級(jí)別并發(fā)請(qǐng)求的處理能力,其通常被用于技術(shù)架構(gòu)中的訪問入口。近幾年云計(jì)算、微服務(wù)、服務(wù)中臺(tái)等架構(gòu)及 DevOps 標(biāo)準(zhǔn)的快速發(fā)展,統(tǒng)一入口、智能路由、有效解耦、基礎(chǔ)設(shè)施拆分等架構(gòu)需求更使得 Nginx 被廣泛應(yīng)用其中。
Nginx 在 DevOps 中的應(yīng)用
DevOps 已成為當(dāng)前最流行的研發(fā)管理標(biāo)準(zhǔn),其倡導(dǎo)的云計(jì)算、微服務(wù)曾被無數(shù)運(yùn)維從業(yè)者視為洪水猛獸,認(rèn)為是取代了運(yùn)維的工作。然而當(dāng)我們真正的理解云計(jì)算及微服務(wù)的架構(gòu)時(shí),也應(yīng)深刻的認(rèn)識(shí)到,這不是搶飯碗而是主動(dòng)投喂。DevOps 標(biāo)準(zhǔn)也正在驅(qū)動(dòng)我們運(yùn)維工作者能更深入的參與到開發(fā)架構(gòu)中,并與研發(fā)達(dá)成交織共存的狀態(tài)。在我看來,這個(gè)紐帶就是 Nginx。
1、業(yè)務(wù)架構(gòu)中的應(yīng)用
互聯(lián)網(wǎng)產(chǎn)品的開發(fā)過程,都是先做一個(gè)當(dāng)前需求的版本,然后再根據(jù)不斷變更的需求,添加新的功能。這是非常符合現(xiàn)實(shí)的邏輯,但隨著技術(shù)的迭代及業(yè)務(wù)需求的增加,也會(huì)給我們的工作帶來諸多的挑戰(zhàn)。比如,在某一功能比較少的時(shí)候,會(huì)由一個(gè)項(xiàng)目組去開發(fā),由于業(yè)務(wù)的不斷的發(fā)展,就會(huì)逐漸擴(kuò)大到一個(gè)部門或事業(yè)部的人去共同協(xié)作開發(fā)。此時(shí),原有的單體服務(wù),就會(huì)面臨因業(yè)務(wù)部門調(diào)整或業(yè)務(wù)產(chǎn)品的變化而進(jìn)行拆分。
2015年我就遇到過這樣的問題,商戶服務(wù)曾是一個(gè)團(tuán)隊(duì)開發(fā)的,但由于業(yè)務(wù)部門拆分,就提出了部分分類商戶獨(dú)立開發(fā)的需求,如果拆分由開發(fā)完成,則會(huì)面臨技術(shù)架構(gòu)、技術(shù)棧遷移、業(yè)務(wù)開發(fā)成本增加等多方面的問題。基于實(shí)施的便捷性,所以我們運(yùn)維就提供了一個(gè)基于 Nginx 實(shí)現(xiàn)動(dòng)態(tài)路由的平滑拆分方案。訪問架構(gòu)如下所示:
該服務(wù)的URL只有域名和商戶標(biāo)識(shí)碼(http://www.xxxxx.com/shop/111xxxxx),根據(jù)這個(gè)特點(diǎn),我們?cè)O(shè)計(jì)了一個(gè)由 Nginx + Lua + Redis 構(gòu)成的動(dòng)態(tài)路由架構(gòu), 由 Nginx 做入口動(dòng)態(tài)路由。為避免阻塞,所以我們本著最少路由判斷邏輯的原則,將所有的商戶標(biāo)識(shí)碼都以 Key 的形式存儲(chǔ)在 Redis,每個(gè) key 對(duì)應(yīng)的 value 則是相應(yīng)的被代理服務(wù)器組標(biāo)識(shí),當(dāng)用戶的訪問進(jìn)入 Nginx 后,由 lua 腳本快速的從 redis 中讀取到對(duì)應(yīng)的標(biāo)識(shí),并將用戶的訪問,路由到對(duì)應(yīng)標(biāo)識(shí)的被代理服務(wù)器組中。
開發(fā)同事開發(fā)了一個(gè)商戶代碼管理小工具,可以實(shí)現(xiàn)商戶標(biāo)識(shí)碼的動(dòng)態(tài)管理。這樣我們就用很短的時(shí)間,將單一商戶服務(wù)的代碼按照業(yè)務(wù)的維度拆分成了商戶、酒店、旅游、電影等多個(gè)服務(wù),開發(fā)可以先將代碼復(fù)制多套,再根據(jù)各自開發(fā)的進(jìn)度進(jìn)行逐商戶或整體的進(jìn)行替換。該方案在很短的時(shí)間內(nèi)實(shí)現(xiàn)了服務(wù)拆分工作的實(shí)施,并為開發(fā)團(tuán)隊(duì)為日后商戶服務(wù)的開發(fā)提供了更多的可能。
總之,無論是 Open API 、微服務(wù)亦或是中臺(tái)架構(gòu),Nginx 總可以通過其強(qiáng)大的功能,為開發(fā)減負(fù)并實(shí)現(xiàn)架構(gòu)變化的平滑過渡。通過 Nginx 做路由及數(shù)據(jù)處理可以靈活的解決開發(fā)架構(gòu)多變的問題,并以不變應(yīng)萬變的能力,滿足不同階段開發(fā)架構(gòu)的需求。
2、應(yīng)急保障中的應(yīng)用
在運(yùn)維保障工作中,RTO(Recovery Time Objective,恢復(fù)時(shí)間目標(biāo))和 RPO(Recovery Point Objective,恢復(fù)點(diǎn)目標(biāo))是衡量運(yùn)維保障工作的一個(gè)重要指標(biāo)。RTO 指的是從業(yè)務(wù)故障發(fā)生到整個(gè)業(yè)務(wù)系統(tǒng)恢復(fù)所需的最大時(shí)長。而 RPO 則是指可能丟失數(shù)據(jù)的最大時(shí)長。這兩個(gè)指標(biāo),都對(duì)運(yùn)維架構(gòu)的災(zāi)備、應(yīng)急切換能力提出了嚴(yán)峻的挑戰(zhàn)。
目前流行的做法是多活架構(gòu),但在實(shí)際實(shí)施中,多活架構(gòu)投入成本高、實(shí)施周期長、對(duì)已有的技術(shù)架構(gòu)變更的難度較大,且后期投入的維護(hù)工作也非常巨大。此時(shí)可以利用Nginx 設(shè)計(jì)一個(gè)動(dòng)態(tài)降級(jí)的方案,對(duì)小規(guī)模且開發(fā)架構(gòu)技術(shù)能力較低時(shí)期的應(yīng)急保障工作起到有效的補(bǔ)充。該方案整體投入小,即可以快速實(shí)施落地,又可以在發(fā)生故障時(shí)實(shí)快速切換,并記錄故障期間的用戶變更數(shù)據(jù)的請(qǐng)求,最大化的避免數(shù)據(jù)的丟失。方案設(shè)計(jì)如下:
- 所有的靜態(tài)資源交由 CDN 廠商提供訪問服務(wù)
- 降級(jí)集群異地機(jī)房部署
- 正常訪問時(shí),Nginx 負(fù)載實(shí)時(shí)同步 GET 請(qǐng)求及響應(yīng)結(jié)果到降級(jí)集群,降級(jí)集群的Nginx 將同步的數(shù)據(jù)處理后,存儲(chǔ)到 Redis 集群中
- 當(dāng)業(yè)務(wù)服務(wù)發(fā)生故障時(shí),按照故障情況通過 DNS 或 Nginx 負(fù)載將用戶訪問切換到降級(jí)集群中
- 業(yè)務(wù)服務(wù)恢復(fù)后,通過 Nginx 負(fù)載逐步將用戶訪問切回
- 通過專用工具,將記錄的 POST 數(shù)據(jù)中變更的數(shù)據(jù)恢復(fù)到數(shù)據(jù)庫中
該方案只是個(gè)探討模型,在實(shí)際實(shí)施中仍有諸多問題需要去考慮,例如:
- GET 方法的 URL 最小取值,以避免重復(fù)數(shù)據(jù)占用更多的存儲(chǔ)空間
- 登錄用戶的處理及 GET 方法請(qǐng)求的個(gè)性化問題
- POST 方法數(shù)據(jù)與用戶身份的綁定
- POST 記錄數(shù)據(jù)的恢復(fù)準(zhǔn)確性設(shè)計(jì)
- 訪問切換的監(jiān)控
- 前端用戶的提示信息
3、運(yùn)維的數(shù)據(jù)化運(yùn)營
Nginx 通常被置于服務(wù)器訪問的入口,其訪問日志可以全局的記錄用戶訪問的來源、響應(yīng)時(shí)間、行為熱點(diǎn)等數(shù)據(jù),通過對(duì)訪問日志的分析,可以清晰的了解用戶來源、行為習(xí)慣及自身服務(wù)器性能等情況。借助 ELK 的高性能處理能力,可以實(shí)時(shí)的將數(shù)據(jù)分析結(jié)果展現(xiàn)給服務(wù)器的維護(hù)人員及應(yīng)用的開發(fā)人員,進(jìn)而不斷提高業(yè)務(wù)的可用性及產(chǎn)品的用戶體驗(yàn)。
對(duì) Nginx 的日志可以從安全、性能、可用性及訪問統(tǒng)計(jì)4個(gè)方面進(jìn)行分類處理。安全方面的可以即時(shí)記錄訪問者IP,根據(jù)現(xiàn)階段的實(shí)際情況進(jìn)行人工或自動(dòng)的屏蔽。性能方面可以結(jié)合基礎(chǔ)資源監(jiān)控分析原因并作出提前預(yù)判。可用性中若是業(yè)務(wù)設(shè)計(jì)方面的則可及時(shí)反饋給產(chǎn)品,以做出更友好的提示信息。訪問統(tǒng)計(jì)方面的則可提供給相應(yīng)的部門,進(jìn)行進(jìn)一步分析處理。運(yùn)維的工作不僅是響應(yīng)外部的需求,通過 Nginx 提供的強(qiáng)大功能,也可以主動(dòng)的參與到企業(yè)的數(shù)據(jù)化運(yùn)營工作中。
4、微服務(wù)中的 Nginx
微服務(wù)是 DevOps 水平的一個(gè)重要標(biāo)志,微服務(wù)架構(gòu)中的服務(wù)網(wǎng)格(Service Mesh)及serverless 的架構(gòu)設(shè)計(jì),其最大的理念就是將可復(fù)用的、基礎(chǔ)的非業(yè)務(wù)功能從業(yè)務(wù)開發(fā)中剝離出來,例如服務(wù)發(fā)現(xiàn)、端到端認(rèn)證、訪問追蹤、組件依賴等功能。在向服務(wù)網(wǎng)格遷移的過程中,Nginx 更是起到了重要的作用。
- 路由網(wǎng)格架構(gòu) ,這個(gè)架構(gòu)是向服務(wù)網(wǎng)格過渡的初級(jí)架構(gòu),其無需對(duì)原有的單體應(yīng)用和新的微服務(wù)應(yīng)用做什么改造,可以很輕易的遷移進(jìn)來,并為更復(fù)雜的改造積累經(jīng)驗(yàn)。
- Sidecar 代理/Fabric 模型,該模型應(yīng)用程序和代理被被放在了POD里,可以對(duì)應(yīng)用程序的流量做更細(xì)粒度的控制。在該階段可以自己開發(fā)控制平面,也可以選擇直接切換到istio平臺(tái)。
寫在最后
2019年初,電影《流浪地球》讓我們看到了中國科幻電影的希望,但導(dǎo)演郭帆則反復(fù)強(qiáng)調(diào),“我們工業(yè)化不足的時(shí)候就是靠人肉填的,中國電影工業(yè)化還是處在一個(gè)非常早期的階段”。這不禁讓我想到了我從業(yè)的互聯(lián)網(wǎng)行業(yè),我們其實(shí)也一直是在一個(gè)非工業(yè)化環(huán)境中勞作著。工業(yè)化,自然是由自動(dòng)化的“機(jī)器體系”來取代人肉的“手工勞動(dòng)”,其生產(chǎn)過程中的每個(gè)階段都必然是標(biāo)準(zhǔn)化、流程化的。當(dāng)我看到由中國信息通信研究院牽頭,聯(lián)合云計(jì)算開源產(chǎn)業(yè)聯(lián)盟、高效運(yùn)維社區(qū)及國內(nèi)多個(gè)互聯(lián)網(wǎng)大廠編寫的 DevOps 標(biāo)準(zhǔn)-研發(fā)運(yùn)營一體化能力成熟度模型,并正式立項(xiàng)國際標(biāo)準(zhǔn)時(shí),不禁尤感自豪,也深深對(duì)為推動(dòng)我國互聯(lián)網(wǎng)行業(yè)工業(yè)化進(jìn)程努力的精英們深表敬佩。
作為互聯(lián)網(wǎng)從業(yè)人員,也深刻認(rèn)識(shí)到用好開源技術(shù)、推動(dòng)工作內(nèi)容標(biāo)準(zhǔn)化、流程化也是我們?cè)诨ヂ?lián)網(wǎng)行業(yè)工業(yè)化進(jìn)程中應(yīng)盡的一份責(zé)任。
關(guān)于作者
王小東 ,資深運(yùn)維專家,有十余年的互聯(lián)網(wǎng)企業(yè)運(yùn)維和架構(gòu)經(jīng)驗(yàn),擅長服務(wù)器優(yōu)化、大規(guī)模集群管理、開源工具應(yīng)用和業(yè)務(wù)故障處理等。EXIN 認(rèn)證 DevOps Master,專注于運(yùn)維架構(gòu)優(yōu)化、自動(dòng)化運(yùn)維以及運(yùn)維工作的 DevOps 治理。著有《Nginx應(yīng)用與運(yùn)維實(shí)戰(zhàn)》一書。
《Nginx應(yīng)用與運(yùn)維實(shí)戰(zhàn)》是一部基于 Nginx 新版本和云原生應(yīng)用場景系統(tǒng)講解Nginx的著作,是作者十余年運(yùn)維經(jīng)驗(yàn)的總結(jié)。從應(yīng)用、運(yùn)維以及與 Kubernetes 和微服務(wù)集成3個(gè)維度對(duì) Nginx 的基礎(chǔ)知識(shí)、工作原理、核心應(yīng)用、運(yùn)維管理、集成擴(kuò)展等重點(diǎn)內(nèi)容進(jìn)行了全面、細(xì)致的講解。完全以實(shí)戰(zhàn)為導(dǎo)向,包含大量的配置案例和示例代碼,能幫助讀者快速掌握并在實(shí)際工作中熟練應(yīng)用 Nginx。