Apache和Nginx運行原理解析

 

Web服務器php

Web服務器也稱爲WWW(WORLD WIDE WEB)服務器,主要功能是提供網上信息瀏覽服務。html

應用層使用HTTP協議。nginx

HTML文檔格式。數據庫

瀏覽器統一資源定位器(URL)。後端

Web服務器經常以B/S(Browser/Server)方式提供服務。瀏覽器和服務器的交互方式以下:瀏覽器


 GET /index.php HTTP/1.1

 +---------------+                   +----------------+
 |               +------------------->                |
 |   Browser     |                   |   Server       |
 |               <-------------------+                |
 +---------------+                   +----------------+

                   HTTP/1.1 200 OK


服務器

瀏覽器向服務器發出HTTP請求(Request)。架構

服務器收到瀏覽器的請求數據,通過分析處理,向瀏覽器輸出響應數據(Response)。併發

瀏覽器收到服務器的響應數據,通過分析處理,將最終結果顯示在瀏覽器中。負載均衡

Apache和Nginx都屬於Web服務器,二者都實現了HTTP 1.1協議。

 

Apache生命週期
"text">   +--------------------------------------------------------------+
   |                 +---------------------+       啓動階段        |
   |                 |    系統啓動, 配置     |                      |
   |                 +----------+----------+                      |
   |                            |                                 |
   |                 +----------v----------+                      |
   |                 |      模塊的初始化     |                      |
   |                 +-+--------+--------+-+                      |
   |                   |        |        |                        |
   |   +-------------+ | +------v-------+| +--------------+       |
   |   | 子進程初始化  |<+ | 子進程初始化   |+>|  子進程初始化  |       |
   |   +------+------+   +-------+------+  +-------+------+       |
   +--------------------------------------------------------------+
   |          |                  |                 |     運行階段  |
   |     +----v----+        +----v----+       +----v----+         |
   |     | 請求循環 |        |  請求循環 |       | 請求循環 |         |
   |     +----+----+        +----+----+       +----+----+         |
   |          |                  |                 |              |
   |   +------v------+    +------v------+   +------v------+       |
   |   |  子進程結束   |    |  子進程結束  |   |   子進程結束  |       |
   |   +-------------+    +-------------+   +-------------+       |
   +--------------------------------------------------------------+


這個生命週期是在perfork工做下的示意,從圖中能夠看出,Apache對於每個請求都要啓動一個單獨的進程來處理。

 

Apache的工做模式 prefork的工做原理

一個單獨的控制進程(父進程)負責產生子進程,這些子進程用於監聽請求並做出應答。Apache老是試圖保持一些備用的 (spare)或是空閒的子進程用於迎接即將到來的請求。這樣客戶端就無需在獲得服務前等候子進程的產生。在Unix系統中,父進程一般以root身份運行以便邦定80端口,而 Apache產生的子進程一般以一個低特權的用戶運行。User和Group指令用於配置子進程的低特權用戶。運行子進程的用戶必需要對他所服務的內容有讀取的權限,可是對服務內容以外的其餘資源必須擁有儘量少的權限。

 

worker的工做原理

每一個進程可以擁有的線程數量是固定的。服務器會根據負載狀況增長或減小進程數量。一個單獨的控制進程(父進程)負責子進程的創建。每一個子進程可以創建ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。Apache老是試圖維持一個備用(spare)或是空閒的服務線程池。這樣,客戶端無須等待新線程或新進程的創建便可獲得處理。在Unix中,爲了可以綁定80端口,父進程通常都是以root身份啓動,隨後,Apache以較低權限的用戶創建子進程和線程。User和Group指令用於配置Apache子進程的權限。雖然子進程必須對其提供的內容擁有讀權限,但應該儘量給予他較少的特權。另外,除非使用了suexec ,不然,這些指令配置的權限將被CGI腳本所繼承。

 

Apache的運行 啓動階段

       +---------+
       |  開始   |
       +----+---+
            |
 +----------v------------+   解析主配置文件http.conf中配置信息,
 |     解析配置文件        |   像LoadModule, AddType
 +----------+------------+   等指令被加載至內存
            |
 +----------v------------+   依據AddModule, LoadModule等指令
 |   加載靜態/動態模塊      |   加載Apache模塊,像mod_php5.so被
 +----------+------------+   加載至內存,映射到Apache地址空間。
            |
 +----------v------------+   日誌文件、共享內存段,數據庫連接
 |     系統資源初始化      |    等初始化
 +----------+------------+
            |
        +---v----+
        |  結束   |
        +--------+

 

運行階段

一、接受請求

二、將請求的URL映射到本地文件系統

三、檢查請求頭部

四、根據配置判斷是否能訪問所請求的資源

五、用戶認證

六、用戶權限管理(認證)

七、根據請求資源的MIME類型,選擇相應的處理函數

八、捕獲消息

九、Response,生成返回客戶端內容

十、發送後,記錄日誌

十一、清理請求遺留環境,Socket關閉

 

//======================================//

 

Nginx的模塊與工做原理

Nginx由內核和模塊組成,其中,內核的設計很是微小和簡潔,完成的工做也很是簡單,僅僅經過查找配置文件將客戶端請求映射到一個location block(location是Nginx配置中的一個指令,用於URL匹配),而在這個location中所配置的每一個指令將會啓動不一樣的模塊去完成相應的工做。

 

Nginx的模塊從結構上分爲核心模塊、基礎模塊和第三方模塊:

核心模塊:HTTP模塊、EVENT模塊和MAIL模塊

基礎模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊,

第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊和HTTP Access Key模塊。

 

Nginx的模塊從功能上分爲以下三類:

Handlers(處理器模塊)。此類模塊直接處理請求,並進行輸出內容和修改headers信息等操做。Handlers處理器模塊通常只能有一個。

Filters (過濾器模塊)。此類模塊主要對其餘處理器模塊輸出的內容進行修改操做,最後由Nginx輸出。

Proxies (代理類模塊)。此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與後端一些服務好比FastCGI等進行交互,實現服務代理和負載均衡等功能。


"text">                     +                    ^
        Http Request |                    |  Http Response
                     |                    |
    +---------+------v-----+         +----+----+
    |  Conf   | Nginx Core |         | FilterN |
    +---------+------+-----+         +----^----+
                     |                    |
                     |               +----+----+
                     |               | Filter2 |
choose a handler     |               +----^----+
based conf           |                    |
                     |               +----+----+
                     |               | Filter1 |
                     |               +----^----+
                     |                    | Generate content
               +-----v--------------------+----+
               |           Handler             |
               +-------------------------------+

 

Nginx架構及工做流程

Nginx架構

上圖是Nginx的架構,這個架構相似於Apache的Worker工做狀態,Nginx的每個Worker進程都管理着大量的線程,真正處理請求的是Worker之下的線程。

全部實際上的業務處理邏輯都在worker進程。worker進程中有一個函數,執行無限循環,不斷處理收到的來自客戶端的請求,並進行處理,直到整個nginx服務被中止。Worker中這個函數執行內容以下:

操做系統提供的機制(例如epoll, kqueue等)產生相關的事件。

接收和處理這些事件,如是接受到數據,則產生更高層的request對象。

處理request的header和body。

產生響應,併發送回客戶端。

完成request的處理。

從新初始化定時器及其餘事件。

 

 

 

詳細請訪問原文地址 :http://www.server110.com/nginx/201402/6543.html

相關文章
相關標籤/搜索