Nginx基本概念、模組化思想、工作流程、工作原理
前言:
近日因需拓展學習,在網上收集Nginx相關資料。本文介紹其基本概念和基本原理,為以後的應用大小基礎。本人內容為轉載,組合,僅供學習。
一 、Nginx基本概念
(1)、介紹
Nginx是一個高效能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP代理伺服器。
Nginx是一款輕量級的Web伺服器/反向代理伺服器以及電子郵件代理伺服器,並在一個BSD
Nginx相較於Apache\lighttpd具有佔有記憶體少,穩定性高等優勢,並且依靠併發能力強,豐富的模組庫以及友好靈活的配置而聞名。在Linux作業系統下,nginx使用epoll事件模型,得益於此,nginx在Linux作業系統下效率相當高。同時
(2)、名詞解釋
代理伺服器
一般是指區域網內部的機器通過代理伺服器傳送請求到網際網路上的伺服器,代理伺服器一般作用在客戶端。
反向代理
客戶端(使用者A)向反向代理的名稱空間(name-space)中的內容傳送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端。而客戶端始終任務它訪問的事原始伺服器
用途:將防火牆後面的伺服器提供給Internet使用者訪問。反向代理還可以為後端的多臺伺服器提供負載平衡或為後端較慢的伺服器提供緩衝服務。
正向代理
正向代理是一個位於客戶端A和原始伺服器(伺服器B)之間的伺服器(代理伺服器Z),為了從原始伺服器取得內容,使用者A向代理伺服器Z傳送一個請求並指定目標(伺服器B),然後代理伺服器Z向伺服器B轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設定才能使用正向代理。
用途:在防火牆內的區域網客戶端提供訪問Internet的途徑。還可以使用緩衝特性減少網路使用率。
從安全性來講:
正向代理允許客戶端通過它訪問任意網站並且隱藏客戶端自身,因此你必須採取安全措施以確保僅為經過授權的客戶端提供服務。
反向代理對外都是透明的,訪問者並不知道自己訪問的是一個代理。
(3)、Nginx VS Apache
相同點:
1、都是HTTP伺服器軟體
2、功能上都採用模組化結構設計
3、都支援通用的語言介面,如PHP、Perl、Python等
4、支援正向、反向代理、虛擬主機、URL重寫、壓縮傳輸、SSL加密傳輸
不同點:
1、Apache處理速度很慢,佔用很多記憶體資源
2、功能上,Apache所有模組支援動靜態編譯,Nginx模組都是靜態編譯的
3、對Fcgi的支援:Apache支援的很不好,Nginx支援非常好
4、處理連線方式:Nginx支援epoll,Apache不支援
5、空間使用上:Nginx安裝包僅幾百K
(4)、Nginx優勢
1、作為Web伺服器,Nginx處理靜態檔案、索引檔案,自動索引的效率非常高
2、作為代理伺服器,Nginx可以實現無快取的反向代理加速,提高網站執行速度
3、作為負載均衡伺服器,Nginx既可以在內部直接支援Rails和PHP,也可以支援HTTP代理伺服器對外進行服務,同時還支援簡單的容錯和利用演算法進行負載均衡
4、在效能方面,Nginx是專門為效能優化而開發的,實現上非常注重效率。它採用核心Poll模型,可以支援更多的併發連線,最大可以支援對5萬個併發連線數的響應,而且只佔用很低的記憶體資源
5、在穩定性方面,Nginx採取了分階段資源分配技術,使得CPU與記憶體的佔用率非常低。Nginx官方表示,Nginx保持1萬個沒有活動的連線,而這些連線只佔用2.5MB記憶體,因此,類似DOS這樣的攻擊對Nginx來說基本上是沒有任何作用的
6、在高可用性方面,Nginx支援熱部署,啟動速度特別迅速,因此可以在不間斷服務的情況下,對軟體版本或者配置進行升級,即使執行數月也無需重新啟動,幾乎可以做到7x24小時不間斷地執行
Nginx具有很高的穩定性;支援熱部署;程式碼質量非常高,程式碼很規範,手法成熟,模組擴充套件也很容易;採用了一些os提供的最新特性如對sendfile(Linux2.2+),accept-filter(FreeBSD4.1+),TCP_DEFER_ACCEPT(Linux 2.4+)的支援,從而大大提高了效能。
二、Nginx模組化思想
高度模組化的設計設Nginx架構的基礎。在Nginx中,除了少量的核心程式碼,其他一切皆為模組。模組化設計具有以下特點:
1、高度抽象的模組介面
2、靈活性
3、配置模組的設計使Nginx提供了高可配置性、高可擴充套件性、高可定製性、高可伸縮性。
4、核心模組介面簡單化
5、多層次、多類別的模組設計
所有模組間是分層次、分類別的,官方Nginx有五大型別的模組:核心模組、配置模組、事件模組、HTTP模組、mail模組。
配置模組和核心模組這兩種模組型別是由Nginx的框架程式碼所定義的,這裡的配置模組是所有模組的基礎,它實現了最基本的配置項解析功能(解析nginx.conf檔案)。Nginx框架還會呼叫核心模組,但其他三種模組都不會與框架產生直接關係。事件模組、HTTP模組、mail模組這三種模組的共性是:實際上它們在核心模組中各有1個模組作為自己的代言人,並在同類模組中有1個作為核心業務與管理功能的模組。
Nginx模組直接被編譯僅Nginx,因此屬於靜態編譯方式。啟動Nginx後,Nginx的模組被自動載入,不像Apache,首先將模組編譯為一個so檔案,然後再配置檔案彙總指定是否進行載入。在解析配置檔案時,Nginx的每一個模組都有可能去處理某個請求,但是同一個處理請求只能由一個模組來完成。
三、Nginx工作流程
Nginx由一個master程序和多個worker程序組成,但master程序或者worker程序中並不會再建立執行緒。
(1)、master程序和worker程序的作用
master程序
不需要處理網路事件,不負責業務的執行,只會通過管理worker等子程序來實現重啟服務、平滑升級、更換日誌檔案、配置檔案實時生效等功能。
master是通過fork系統呼叫子程序來實現和子程序的通訊。
worker程序
用來處理master程序fork過來的請求
worker程序是通過處理訊號來實現和master通訊的
====================================================================================
(2)、訊號的處理過程
Master程序接收到訊號是怎樣進行處理的?
master程序接收到訊號後,會先重新載入配置檔案,然後再啟動新的程序,並向所有老的程序傳送訊號,告訴他們可以光榮退休了。新的程序在啟動後,就開始接受新的請求,而老的程序在收到來自master訊號後,就不再接收新的請求,並且在當前程序中的所有未處理完的請求處理完成後再退出。
Worker程序接收到訊號是怎樣進行處理的?
首先,worker程序之間是平等的,每個程序,處理請求的機會也是一樣的。當我們提供80埠的http服務時,一個連線請求過來,每個程序都有可能處理這個連線,怎麼做到的呢?首先,每個worker程序都是從master程序fork過來的,在master程序裡面,先建立好需要listen的socket之後,然後再fork出多個worker程序,這樣每個worker程序都可以去接受這個socket。一般來說,當一個連線進來後,所有在accept這個socket上面的程序都會收到通知,而只有一個程序可以接受這個連線,其他的則accept失敗,這就是所謂的驚群現象。
那麼為了解決這個問題,Nginx提供了一個accept_mutex(可選項,預設開啟)。這是一個加在accept上的一把共享所。有了這把鎖之後,同一時刻,就會只有一個程序在accept連線,這樣就不會有驚群問題了。
當一個worker程序在accept這個連線之後,就開始讀取請求,解析請求,處理請求,產生資料後,再返回給客戶端,最後才斷開連線。一個請求,完全由worker程序來處理,而且只在一個worker程序中處理。
====================================================================================
(3)、這樣設計的優點
1、利用多核系統的併發處理能力
現在作業系統都是多核CPU,如果一直是隻有一個程序在工作,那麼浪費資源,如果是worker程序間地位不平等勢必造成程序瓶頸問題,Nginx為了避免這個問題,設計worker間程序平等。另外,worker數與cpu核數一致,則會達到CPU資源的充分利用,如果worker數多於cpu核數,勢必造成資源的競爭;若小於cpu核數,勢必造成資源浪費。提高網路效能,降低請求時延。
2、負載均衡
多個worker之間通過程序通訊來實現負載均衡。即當一個請求到來時,更容易分配到負載較輕的worker程序中處理。這將降低請求的時延,並在一定程度上提高網路效能
3、管理程序負責監控工作程序的狀態,並負責管理其行為
這樣做的好處是:
a.管理程序不會佔用多少系統資源
b.管理程序負責監控工作程序狀態,如果某個工作程序死掉,管理程序負責創建出新的工作程序,避免系統性能下降。提高了系統的可靠性。
c.管理程序支援Nginx服務執行中的程序升級、配置項修改等,使得動態可擴充套件性、動態定製性、動態進化性較容易實現。
四、Nginx工作原理
Nginx會按需同時執行多個程序:一個主程序和幾個工作程序,配置了快取時還會有快取載入器程序(cache loader)和快取管理器程序(cache manager)等。所有程序均是僅含有一個執行緒,並主要通過“共享記憶體”的機制實現程序間通訊。主程序以root使用者身份執行,而worker、cache loader和cache manager均應以非特權使用者身份執行。
(1)、Nginx模組常規的HTTP請求和響應的過程:
當它接收到一個HTTP請求時,它僅僅是通過查詢配置檔案將此次請求對映到一個location block,而此location中配置的各個指令則會啟動不同的模組去完成工作,因此模組可以看做Nginx真正的勞動工作者。通常一個location中的指令會涉及一個handler模組和多個filter模組(當然,多個location可以服用同一個模組)。handler模組負責處理請求,完成響應內容的生成,而filter模組對響應內容進行處理。
(2)、Nginx作為Http反向代理伺服器的用法:
由於Nginx具有“強悍”的高併發高負載能力,因此一般會作為前段的伺服器直接向客戶端提供靜態檔案服務。但也有一些複雜、多變的業務不適合放到Nginx伺服器上,這時會用Apache、Tomcat等伺服器來處理。於是,Nginx通常會被配置為既是靜態Web伺服器也是反向代理伺服器,不適合Nginx處理的請求就會直接轉發到上游伺服器中處理。
Nginx作為HTTP伺服器以及反向代理伺服器:
Nginx作為反向代理伺服器時轉發請求的流程:
Nginx減輕了上游伺服器的併發壓力;延長了一個請求的處理時間,並增加了用於快取請求內容的記憶體和磁碟空間。
(3)、總結
Nginx是一個高效能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。工作原理也很簡單,通過轉發請求,分擔壓力,從而減輕伺服器的壓力,達到負載均衡的效果。