1. 程式人生 > >深度總結|阿里P8Java架構師帶你深入淺出Nginx

深度總結|阿里P8Java架構師帶你深入淺出Nginx

前言

Nginx是一款輕量級的Web伺服器、反向代理伺服器,由於它的記憶體佔用少,啟動極快,高併發能力強,在網際網路專案中廣泛應用。

 

架構圖

 

 

 

上圖基本上說明了當下流行的技術架構,其中Nginx有點入口閘道器的味道。

反向代理伺服器?

經常聽人說到一些術語,如反向代理,那麼什麼是反向代理,什麼又是正向代理呢?

正向代理:

 

正向代理示意圖

 

 

 

反向代理:

 

反向代理示意圖

 

 

 

由於防火牆的原因,我們並不能直接訪問谷歌,那麼我們可以藉助VPN來實現,這就是一個簡單的正向代理的例子。這裡你能夠發現,正向代理“代理”的是客戶端,而且客戶端是知道目標的,而目標是不知道客戶端是通過VPN訪問的。當我們在外網訪問百度的時候,其實會進行一個轉發,代理到內網去,這就是所謂的反向代理,即反向代理“代理”的是伺服器端,而且這一個過程對於客戶端而言是透明的。

Nginx的Master-Worker模式

 

 

 

 

 

nginx程序

啟動Nginx後,其實就是在80埠啟動了Socket服務進行監聽,如圖所示,Nginx涉及Master程序和Worker程序。

 

 

 

 

 

Master-Worker模式

 

 

 

 

nginx.conf

Master程序的作用是? 讀取並驗證配置檔案nginx.conf;管理worker程序;Worker程序的作用是? 每一個Worker程序都維護一個執行緒(避免執行緒切換),處理連線和請求;注意Worker程序的個數由配置檔案決定,一般和CPU個數相關(有利於程序切換),配置幾個就有幾個Worker程序。

思考:Nginx如何做到熱部署?

所謂熱部署,就是配置檔案nginx.conf修改後,不需要stop Nginx,不需要中斷請求,就能讓配置檔案生效!( nginx -s reload 重新載入/nginx -t檢查配置/nginx -s stop
)通過上文我們已經知道worker程序負責處理具體的請求,那麼如果想達到熱部署的效果,可以想象:方案一: 修改配置檔案nginx.conf後,主程序master負責推送給woker程序更新配置資訊,woker程序收到資訊後,更新程序內部的執行緒資訊。(有點valatile的味道)方案二: 修改配置檔案nginx.conf後,重新生成新的worker程序,當然會以新的配置進行處理請求,而且新的請求必須都交給新的worker程序,至於老的worker程序,等把那些以前的請求處理完畢後,kill掉即可。Nginx採用的就是方案二來達到熱部署的!

思考:Nginx如何做到高併發下的高效處理?

上文已經提及Nginx的worker程序個數與CPU繫結、worker程序內部包含一個執行緒高效迴環處理請求,這的確有助於效率,但這是不夠的。 作為專業的程式設計師,我們可以開一下腦洞:BIO/NIO/AIO、非同步/同步、阻塞/非阻塞...要同時處理那麼多的請求,要知道,有的請求需要發生IO,可能需要很長時間,如果等著它,就會拖慢worker的處理速度。 Nginx採用了Linux的epoll模型,epoll模型基於事件驅動機制,它可以監控多個事件是否準備完畢,如果OK,那麼放入epoll佇列中,這個過程是非同步的。worker只需要從epoll佇列迴圈處理即可。

思考:Nginx掛了怎麼辦?

Nginx既然作為入口閘道器,很重要,如果出現單點問題,顯然是不可接受的。答案是: Keepalived+Nginx實現高可用。Keepalived是一個高可用解決方案,主要是用來防止伺服器單點發生故障,可以通過和Nginx配合來實現Web服務的高可用。(其實,Keepalived不僅僅可以和Nginx配合,還可以和很多其他服務配合)Keepalived+Nginx實現高可用的思路:第一:請求不要直接打到Nginx上,應該先通過Keepalived(這就是所謂虛擬IP,VIP)第二:Keepalived應該能監控Nginx的生命狀態(提供一個使用者自定義的指令碼,定期檢查Nginx程序狀態,進行權重變化,,從而實現Nginx故障切換)

 

 

 

 

 

Keepalived+Nginx

我們的主戰場:nginx.conf

很多時候,在開發、測試環境下,我們都得自己去配置Nginx,就是去配置nginx.conf。nginx.conf是典型的分段配置檔案,下面我們來分析下。

虛擬主機

 

 

 

 

http的server段

 

 

 

 

訪問結果

其實這是把Nginx作為web server來處理靜態資源。第一:location可以進行正則匹配,應該注意正則的幾種形式以及優先順序。(這裡不展開)第二:Nginx能夠提高速度的其中一個特性就是:動靜分離,就是把靜態資源放到Nginx上,由Nginx管理,動態請求轉發給後端。 第三:我們可以在Nginx下把靜態資源、日誌檔案歸屬到不同域名下(也即是目錄),這樣方便管理維護。第四:Nginx可以進行IP訪問控制,有些電商平臺,就可以在Nginx這一層,做一下處理,內建一個黑名單模組,那麼就不必等請求通過Nginx達到後端在進行攔截,而是直接在Nginx這一層就處理掉。

反向代理【proxy_pass】

所謂反向代理,很簡單,其實就是在location這一段配置中的root替換成 proxy_pass即可。root說明是靜態資源,可以由Nginx進行返回;而proxy_pass說明是動態請求,需要進行轉發,比如代理到Tomcat上。反向代理,上面已經說了,過程是透明的,比如說request -> Nginx -> Tomcat,那麼對於Tomcat而言,請求的IP地址就是Nginx的地址,而非真實的request地址,這一點需要注意。不過好在Nginx不僅僅可以反向代理請求,還可以由使用者 自定義設定HTTP HEADER

負載均衡【upstream】

上面的反向代理中,我們通過proxy_pass來指定Tomcat的地址,很顯然我們只能指定一臺Tomcat地址,那麼我們如果想指定多臺來達到負載均衡呢?第一,通過 upstream來定義一組Tomcat,並指定負載策略(IPHASH、加權論調、最少連線),健康檢查策略(Nginx可以監控這一組Tomcat的狀態)等。第二,將proxy_pass替換成upstream指定的值即可。 負載均衡可能帶來的問題?負載均衡所帶來的明顯的問題是,一個請求,可以到A server,也可以到B server,這完全不受我們的控制,當然這也不是什麼問題,只是我們得注意的是: 使用者狀態的儲存問題,如Session會話資訊,不能在儲存到伺服器上。

快取

快取,是Nginx提供的,可以加快訪問速度的機制,說白了,在配置上就是一個開啟,同時指定目錄,讓快取可以儲存到磁碟上。具體配置,大家可以參考Nginx官方文件,這裡就不在展開了。

好了,到這裡,Nginx的介紹就到這裡了。

最後給大家分享一份【Nginx實戰】電子書,加入我的粉絲群(Java填坑之路:659655594)即可免費獲得電子書的免費領取方式!

 

相關推薦

深度總結阿里P8Java架構深入淺出Nginx

前言 Nginx是一款輕量級的Web伺服器、反向代理伺服器,由於它的記憶體佔用少,啟動極快,高併發能力強,在網際網路專案中廣泛

阿里P8“架構深入瞭解Dubbo分散式服務框架

一、產生的背景 隨著網際網路的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。下面我們用一個圖來具體說明架構和開發框架的演進過程。   單一應用架構 當網站流量很小時,只需一個

深入淺出阿里P7架構分析ArrayList集合原始碼,建議是先收藏再看!

# ArrayList簡介 ArrayList 是 Java 集合框架中比較常用的資料結構了。ArrayList是可以**動態增長和縮減的索引序列**,內部封裝了一個**動態再分配的Object[]陣列** ![](https://upload-images.jianshu.io/upload_image

阿里P8Java架構分享:程式設計師應該具備的習慣

1.時刻提醒自己:學習 學習某件事的第一步是承認你不知道。這聽起來很正常,但經驗豐富的程式設計師還記得要真正讓自己承認這一點需要花多長時間。很多電腦科學專業的學生畢業的時候,都有一種很傲慢的態度,就是“我知道最好的”,但其實這只是一種虛張聲勢,他們不知道從哪裡來的自信,就好像他們什麼都知道,並且

阿裏P8高級架構領略阿裏巴巴微服務架構——最後有驚喜哦

Java 程序員 編程Dubbo微服務框架的核心功能 啟動時檢查 ?Dubbo 缺省會在啟動時檢查依賴的服務是否可用,不可用時會拋出異常,阻止 Spring 初始化完成,以便上線時,能及早發現問題,默認 check="true" 集群容錯 failover 失敗自動切換,當出現失敗

架構玩轉分布式鎖

src 效率 獲取鎖 當我 mysql 代碼 red 目錄 在線   大多數互聯網系統都是分布式部署的,分布式部署確實能帶來性能和效率上的提升,但為此,我們就需要多解決一個分布式環境下,數據一致性的問題。   當某個資源在多系統之間,具有共享性的時候,為了保證大家訪問這個資

不懂高性能的負載均衡設計?沒關系,架構

訪問速度 便宜 webp gcj load lib 我們 gin 本質 在軟件系統的架構設計中,對集群的負載均衡設計是作為高性能系統優化環節中必不可少的方案。負載均衡本質上是用於將用戶流量進行均衡減壓的,因此在互聯網的大流量項目中,其重要性不言而喻。 一、什麽是負載均衡?

P7架構構建高可用ZooKeeper集群

server ado 斷開 分布式 建立 kafka 保存 步驟 運行 前言: ZooKeeper 是 Apache 的一個頂級項目,為分布式應用提供高效、高可用的分布式協調服務,提供了諸如數據發布/訂閱、負載均衡、命名服務、分布式協調/通知和分布式鎖等分布式基礎服務。由於

八年一線架構,0基礎入門大數據

軟件 基礎入門 roc rom 培訓 開發 ger 流程控制 入門 在職八年老司機帶你0基礎入門大數據 ,教你如何從小白變成行業精英 ,讓高薪變的簡單! 孫老師太閣孫老師具備8年從業經驗,4年大數據經驗,4年培訓講師經驗,精通java python 和大數據生態圈,曾擔任清

架構深入解讀HashMap

HashMap 和 HashSet 是 Java Collection Framework 的兩個重要成員,其中 HashMap 是 Map 介面的常用實現類,HashSet 是 Set 介面的常用實現類。雖然 HashMap 和 HashSet 實現的介面規範不同,但它們底

攜程系統架構手寫spring mvc,解讀spring核心原始碼!

講師簡介: James老師 系統架構師、專案經理 十餘年Java經驗,曾就職於攜程、人人網等一線網際網路公司,專注於java領域,精通軟體架構設計,對於高併發、高效能服務有深刻的見解, 在服務化基礎架構和微服務技術有大量的建設和設計經驗。   課程內容: 1.為什麼讀Spr

不懂高效能的負載均衡設計?沒關係,架構

在軟體系統的架構設計中,對叢集的負載均衡設計是作為高效能系統優化環節中必不可少的方案。負載均衡本

負載均衡是何物?高階架構

負載均衡是何物?高階架構師帶你飛 自己理解的負載均衡 大神理解的負載均衡 一、什麼是負載均衡? 二、負載均衡方案有幾種? 三、常用的均衡演算法有哪些? 自己理解的負載均衡 自己理解的負

一線架構玩效能優化

1.什麼是系統優化 系統優化一個方面是系統化的對IT系統或交易鏈上的每個環節進行分析並優化,另一個是對單一系統進行瓶頸點分析和調優。但優化的目標大致相同,無非是提高系統的響應速度、吞吐量、降低各層耦合,以應對靈活對邊的市場。 系統優化的3個層次:IT架構治理層、系統層、基礎設施層。 IT系統治理層

K3s初探:Rancher架構嚐鮮史上最輕量Kubernetes發行版

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

阿里P7架構告訴Java架構必須知道的 6 大設計原則

開發十年,就只剩下這套架構體系了! >>>   

成為架構需要學習哪些技能?阿里P9架構解答

開發十年,就只剩下這套架構體系了! >>>   

P7架構深入瞭解執行緒的發展歷史

  專題簡介 作為一個合格的Java程式設計師,必須要對併發程式設計有一個深層次的瞭解,在很多網際網路企業都會

資深架構從JVM層面瞭解執行緒的啟動和停止

  文章簡介 這一篇主要圍繞執行緒狀態控制相關的操作分析執行緒的原理,比如執行緒的中斷,執行緒的通訊等,內容比較

資深架構詳細瞭解,Spring之IoC容器

    一、 IoC概述 IoC(Inverse of Control,控制反轉)是Spring容