Nginx系列(6):Web服務器分析(理論)

目錄

一、Apache 的工作模式

1.apache三種工作模式

2.prefork的工作原理

3.worker的工作原理

4.event 基於事件機制的特性

二、支持高併發的Web服務器

三、Nginx詳解

1.簡介

2.Nginx 工作原理

3.Nginx 架構

4.Nginx 基礎功能

5.Nginx IMAP/POP3 代理服務功能

6.Nginx 支持的操作系統

7.Nginx 結構與擴展

8.Nginx 其他HTTP功能

9.爲什麼選擇Nginx


一、Apache 的工作模式

1.apache三種工作模式

我們都知道Apache有三種工作模塊,分別爲prefork、worker、event。

  • prefork:多進程,每個請求用一個進程響應,這個過程會用到select機制來通知。
  • worker:多線程,一個進程可以生成多個線程,每個線程響應一個請求,但通知機制還是select不過可以接受更多的請求。
  • event:基於異步I/O模型,一個進程或線程,每個進程或線程響應多個用戶請求,它是基於事件驅動(也就是epoll機制)實現的。

2.prefork的工作原理

       如果不用“--with-mpm”顯式指定某種MPM,prefork就是Unix平臺上缺省的MPM.它所採用的預派生子進程方式也是 Apache1.3中採用的模式.prefork本身並沒有使用到線程,2.0版使用它是爲了與1.3版保持兼容性;另一方面,prefork用單獨的子 進程來處理不同的請求,進程之間是彼此獨立的,這也使其成爲最穩定的MPM之一。

3.worker的工作原理

       相對於prefork,worker是2.0版中全新的支持多線程和多進程混合模型的MPM.由於使用線程來處理,所以可以處理相對海量的請求,而 系統資源的開銷要小於基於進程的服務器.但是,worker也使用了多進程,每個進程又生成多個線程,以獲得基於進程服務器的穩定性.這種MPM的工作方 式將是Apache2.0的發展趨勢。

4.event 基於事件機制的特性

       一個進程響應多個用戶請求,利用callback機制,讓套接字複用,請求過來後進程並不處理請求,而是直接交由其他機制來處理,通過epoll機制來通知請求是否完成;在這個過程中,進程本身一直處於空閒狀態,可以一直接收用戶請求。可以實現一個進程程響應多個用戶請求。支持持海量併發連接數,消耗更少的資源。


二、支持高併發的Web服務器

有幾個基本條件:

1.基於線程,即一個進程生成多個線程,每個線程響應用戶的每個請求。

2.基於事件的模型,一個進程處理多個請求,並且通過epoll機制來通知用戶請求完成。

3.基於磁盤的AIO(異步I/O)

4.支持mmap內存映射,mmap傳統的web服務器,進行頁面輸入時,都是將磁盤的頁面先輸入到內核緩存中,再由內核緩存中複製一份到web服務器上,mmap機制就是讓內核緩存與磁盤進行映射,web服務器,直接複製頁面內容即可。不需要先把磁盤的上的頁面先輸入到內核緩存去。

剛好,Nginx 支持以上所有特性。所以Nginx官網上說,Nginx支持50000併發,是有依據的。好了,基礎知識就說到這邊下面我們來談談我們今天講解的重點Nginx。


三、Nginx詳解

1.簡介

       傳統上基於進程或線程模型架構的web服務通過每進程或每線程處理併發連接請求,這勢必會在網絡和I/O操作時產生阻塞,其另一個必然結果則是對內存或CPU的利用率低下。生成一個新的進程/線程需要事先備好其運行時環境,這包括爲其分配堆內存和棧內存,以及爲其創建新的執行上下文等。這些操作都需要佔用CPU,而且過多的進程/線程還會帶來線程抖動或頻繁的上下文切換,系統性能也會由此進一步下降。

另一種高性能web服務器/web服務器反向代理:Nginx(Engine X),nginx的主要着眼點就是其高性能以及對物理計算資源的高密度利用,因此其採用了不同的架構模型。受啓發於多種操作系統設計中基於“事件”的高級處理機制,nginx採用了模塊化、事件驅動、異步、單線程及非阻塞的架構,並大量採用了多路複用及事件通知機制。在nginx中,連接請求由爲數不多的幾個僅包含一個線程的進程worker以高效的迴環(run-loop)機制進行處理,而每個worker可以並行處理數千個的併發連接及請求。

2.Nginx 工作原理

       Nginx會按需同時運行多個進程:一個主進程(master)和幾個工作進程(worker),配置了緩存時還會有緩存加載器進程(cache loader)和緩存管理器進程(cache manager)等。所有進程均是僅含有一個線程,並主要通過“共享內存”的機制實現進程間通信。主進程以root用戶身份運行,而worker、cache loader和cache manager均應以非特權用戶身份運行。

主進程主要完成如下工作:

  • 讀取並驗正配置信息;
  • 創建、綁定及關閉套接字;
  • 啓動、終止及維護worker進程的個數;
  • 無須中止服務而重新配置工作特性;
  • 控制非中斷式程序升級,啓用新的二進制程序並在需要時回滾至老版本;
  • 重新打開日誌文件;
  • 編譯嵌入式perl腳本;

worker進程主要完成的任務包括:

  • 接收、傳入並處理來自客戶端的連接;
  • 提供反向代理及過濾功能;
  • nginx任何能完成的其它任務;

注:如果負載以CPU密集型應用爲主,如SSL或壓縮應用,則worker數應與CPU數相同;如果負載以IO密集型爲主,如響應大量內容給客戶端,則worker數應該爲CPU個數的1.5或2倍。

3.Nginx 架構

       Nginx的代碼是由一個核心和一系列的模塊組成, 核心主要用於提供Web Server的基本功能,以及Web和Mail反向代理的功能;還用於啓用網絡協議,創建必要的運行時環境以及確保不同的模塊之間平滑地進行交互。不過,大多跟協議相關的功能和某應用特有的功能都是由nginx的模塊實現的。這些功能模塊大致可以分爲事件模塊、階段性處理器、輸出過濾器、變量處理器、協議、upstream和負載均衡幾個類別,這些共同組成了nginx的http功能。事件模塊主要用於提供OS獨立的(不同操作系統的事件機制有所不同)事件通知機制如kqueue或epoll等。協議模塊則負責實現nginx通過http、tls/ssl、smtp、pop3以及imap與對應的客戶端建立會話。在Nginx內部,進程間的通信是通過模塊的pipeline或chain實現的;換句話說,每一個功能或操作都由一個模塊來實現。例如,壓縮、通過FastCGI或uwsgi協議與upstream服務器通信,以及與memcached建立會話等。

4.Nginx 基礎功能

  • 處理靜態文件,索引文件以及自動索引;
  • 反向代理加速(無緩存),簡單的負載均衡和容錯;
  • FastCGI,簡單的負載均衡和容錯;
  • 模塊化的結構。過濾器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI過濾器中,到同一個 proxy 或者 FastCGI 的多個子請求併發處理;
  • SSL 和 TLS SNI 支持;

5.Nginx IMAP/POP3 代理服務功能

  • 使用外部 HTTP 認證服務器重定向用戶到 IMAP/POP3 後端;
  • 使用外部 HTTP 認證服務器認證用戶後連接重定向到內部的 SMTP 後端;
  • 認證方法:
  • POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;
  • IMAP: IMAP LOGIN;
  • SMTP: AUTH LOGIN PLAIN CRAM-MD5;
  • SSL 支持;
  • 在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;

6.Nginx 支持的操作系統

  • FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;
  • Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;
  • Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;
  • MacOS X (10.4) PPC;
  • Windows 編譯版本支持 windows 系列操作系統;

7.Nginx 結構與擴展

  • 一個主進程和多個工作進程,工作進程運行於非特權用戶;
  • kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支持;
  • kqueue支持的不同功能包括 EV_CLEAR, EV_DISABLE (臨時禁止事件), NOTE_LOWAT, EV_EOF, 有效數據的數目,錯誤代碼;
  • sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持;
  • 輸入過濾 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;
  • 10,000 非活動的 HTTP keep-alive 連接僅需要 2.5M 內存。
  • 最小化的數據拷貝操作;

8.Nginx 其他HTTP功能

  • 基於IP 和名稱的虛擬主機服務;
  • Memcached 的 GET 接口;
  • 支持 keep-alive 和管道連接;
  • 靈活簡單的配置;
  • 重新配置和在線升級而無須中斷客戶的工作進程;
  • 可定製的訪問日誌,日誌寫入緩存,以及快捷的日誌回捲;
  • 4xx-5xx 錯誤代碼重定向;
  • 基於 PCRE 的 rewrite 重寫模塊;
  • 基於客戶端 IP 地址和 HTTP 基本認證的訪問控制;
  • PUT, DELETE, 和 MKCOL 方法;
  • 支持 FLV (Flash 視頻);
  • 帶寬限制;

9.爲什麼選擇Nginx

  • 在高連接併發的情況下,Nginx是Apache服務器不錯的替代品: Nginx在美國是做虛擬主機生意的老闆們經常選擇的軟件平臺之一. 能夠支持高達 50,000 個併發連接數的響應, 感謝Nginx爲我們選擇了 epoll and kqueue 作爲開發模型。
  • Nginx作爲負載均衡服務器: Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務, 也可以支持作爲 HTTP代理 服務器對外進行服務. Nginx採用C進行編寫, 不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多。
  • 作爲郵件代理服務器: Nginx 同時也是一個非常優秀的郵件代理服務器(最早開發這個產品的目的之一也是作爲郵件代理服務器), Last.fm 描述了成功並且美妙的使用經驗.
  • Nginx 是一個 [#installation 安裝] 非常的簡單 , 配置文件 非常簡潔(還能夠支持perl語法),Bugs 非常少的服務器: Nginx 啓動特別容易, 並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啓動. 你還能夠 不間斷服務的情況下進行軟件版本的升級 。
  • Nginx 的誕生主要解決C10K問題。

好了,準備工作至此爲止,關於Nginx的大範疇的理論部分不再贅述了,接下來開始玩耍Nginx應用,希望有所收穫……


願你就像早晨八九點鐘的太陽,活力十足,永遠年輕。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章