前言
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如何做到熱部署?
通過上文我們已經知道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故障切換)
我們的主戰場: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是一款輕量級的web伺服器 反向 伺服器,由於它的記憶體占用少,啟動極快,高併發能力強,在網際網路專案中廣泛應用。架構圖上圖基本上說明了當下流行的技術架構,其中nginx有點入口閘道器的味道。反向 伺服器?經常聽人說到一些術語,如反向 那麼什麼是反向 什麼又是正向 呢?正向 正向 示...
深入淺出nginx
什麼是nginx?nginx 是乙個高效能的http和反向 web伺服器,同時也提供了imap pop3 smtp服務。說到nginx,那自然會聯想到反向 那麼什麼是反向 呢?既然有反向 那肯定也有正向 正向 又是什麼呢?什麼是正向 正向 意思是乙個位於客戶端和原始伺服器 origin server...
Nginx 的深入淺出
1.什麼是nginx nginx是一款高效能的http 伺服器 反向 伺服器及電子郵件 imap pop3 伺服器。由俄羅斯的程式設計師igor sysoev所開發,官方測試nginx能夠支支撐5萬併發鏈結,並且cpu 記憶體等資源消耗卻非常低,執行非常穩定。2.nginx的應用場景 3.nginx...