歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

從運行原理及使用場景看Apache和Nginx

Web服務器

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

  • 應用層使用HTTP協議。
  • HTML文檔格式。
  • 浏覽器統一資源定位器(URL)。

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

                 GET /index.php HTTP/1.1

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

                   HTTP/1.1 200 OK
  1. 浏覽器向服務器發出HTTP請求(Request)。
  2. 服務器收到浏覽器的請求數據,經過分析處理,向浏覽器輸出響應數據(Response)。
  3. 浏覽器收到服務器的響應數據,經過分析處理,將最終結果顯示在浏覽器中。

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

Apache

概述

Apache HTTP Server是Apache軟件基金會的一個開放源代碼的網頁服務器,可以在大多數計算機操作系統中運行,由於其跨平台和安全性。被廣泛使用,是最流行的 Web服務器端軟件之一。它快速、可靠並且可通過簡單的API擴充,將Perl/Python等解釋器編譯到服務器中。 – 維基百科

Apache組件

Apache是基於模塊化設計的,它的核心代碼並不多,大多數的功能都被分散到各個模塊中,各個模塊在系統啟動的時候按需載入。

         +----------+
      +- | Module   | -----------------+
      |  +----------+                  |
      |                          +------------+
+-----------+   Apache HTTPD     | php module |
| Module    |                    +------------+
+-----------+              +----------+|
      +----------+-------- |  MPM     |+
                 |         +----+---+-+
               +-v-----------+  |   |
               |    ARP      <--+   |
               +------+------+      |
                      |             |
      +---------------v-------------v--+
      |      Operating  System         |
      +--------------------------------+

MPM(Multi -Processing Modules,多重處理模塊)是Apache的核心組件之一,Apache通過MPM來使用操作系統的資源,對進程和線程池進行管理。Apache為了能夠獲得最好的運行性能,針對不同的平台 (Unix/Linux、Window)做了優化,為不同的平台提供了不同的MPM,用戶可以根據實際情況進行選擇,其中最常使用的MPM有 prefork和worker兩種。至於您的服務器正以哪種方式運行,取決於安裝Apache過程中指定的MPM編譯參數,在X系統上默認的編譯參數為 prefork。

由於大多數的Unix都不支持真正的線程,所以采用了預派生子進程(prefork)方式,象Windows或者Solaris這些支持 線程的平台,基於多進程多線程混合的worker模式是一種不錯的選擇。Apache中還有一個重要的組件就是APR(Apache portable Runtime Library),即Apache可移植運行庫,它是一個對操作系統調用的抽象庫,用來實現Apache內部組件對操作系統的使用,提高系統的可移植性。 Apache對於php的解析,就是通過眾多Module中的php Module來完成的。

Apache生命周期

   +--------------------------------------------------------------+
   |                 +---------------------+       啟動階段        |
   |                 |    系統啟動, 配置     |                      |
   |                 +----------+----------+                      |
   |                            |                                 |
   |                 +----------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的運行

啟動階段

在啟動階段,Apache主要進行配置文件解析(例如http.conf以及Include指令設定的配置文件等)、模塊加載(例如 mod_php.so,mod_perl.so等)和系統資源初始化(例如日志文件、共享內存段等)工作。在這個階段,Apache為了獲得系統資源最大的使用權限,將以特權用戶root(X系統)或超級管理員administrator(Windows系統)完成啟動。

這個過程可以通過下圖來深入了解:

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

運行階段

在運行階段,Apache主要工作是處理用戶的服務請求。在這個階段,Apache放棄特權用戶級別,使用普通權限,這主要是基於安全性的考慮,防止由於代碼的缺陷引起的安全漏洞。

由於Apache的Hook機制,Apache 允許模塊(包括內部模塊和外部模塊,例如mod_php5.so,mod_perl.so等)將自定義的函數注入到請求處理循環中。mod_php5.so/php5apache2.dll就是將所包含的自定義函數,通過Hook機制注入到Apache中,在Apache處理流程的各個階段負責處理php請求。

Apache將請求處理循環分為11個階段,依次是:Post-Read-Request,URI Translation,Header Parsing,Access Control,Authentication,Authorization,MIME Type Checking,FixUp,Response,Logging,CleanUp。

Apache處理http請求的生命周期:

Apache處理http請求的生命周期

  1. Post-Read-Request階段:在正常請求處理流程中,這是模塊可以插入鉤子的第一個階段。對於那些想很早進入處理請求的模塊來說,這個階段可以被利用。
  2. URI Translation階段 : Apache在本階段的主要工作:將請求的URL映射到本地文件系統。模塊可以在這階段插入鉤子,執行自己的映射邏輯。mod_alias就是利用這個階段工作的。
  3. Header Parsing階段 : Apache在本階段的主要工作:檢查請求的頭部。由於模塊可以在請求處理流程的任何一個點上執行檢查請求頭部的任務,因此這個鉤子很少被使用。mod_setenvif就是利用這個階段工作的。
  4. Access Control階段 : Apache在本階段的主要工作:根據配置文件檢查是否允許訪問請求的資源。Apache的標准邏輯實現了允許和拒絕指令。mod_authz_host就是利用這個階段工作的。
  5. Authentication階段 : Apache在本階段的主要工作:按照配置文件設定的策略對用戶進行認證,並設定用戶名區域。模塊可以在這階段插入鉤子,實現一個認證方法。
  6. Authorization階段 : Apache在本階段的主要工作:根據配置文件檢查是否允許認證過的用戶執行請求的操作。模塊可以在這階段插入鉤子,實現一個用戶權限管理的方法。
  7. MIME Type Checking階段 : Apache在本階段的主要工作:根據請求資源的MIME類型的相關規則,判定將要使用的內容處理函數。標准模塊mod_negotiation和mod_mime實現了這個鉤子。
  8. FixUp階段 : 這是一個通用的階段,允許模塊在內容生成器之前,運行任何必要的處理流程。和Post_Read_Request類似,這是一個能夠捕獲任何信息的鉤子,也是最常使用的鉤子。
  9. Response階段 : Apache在本階段的主要工作:生成返回客戶端的內容,負責給客戶端發送一個恰當的回復。這個階段是整個處理流程的核心部分。
  10. Logging階段 : Apache在本階段的主要工作:在回復已經發送給客戶端之後記錄事務。模塊可能修改或者替換Apache的標准日志記錄。
  11. CleanUp階段 : Apache在本階段的主要工作:清理本次請求事務處理完成之後遺留的環境,比如文件、目錄的處理或者Socket的關閉等等,這是Apache一次請求處理的最後一個階段。

Nginx

概述

Nginx(發音同engine x)是一款由俄羅斯程序員Igor Sysoev所開發輕量級的網頁服務器、反向代理服務器以及電子郵件(IMAP/POP3)代理服務器。起初是供俄國大型的門戶網站及搜索引擎Rambler(俄語:Рамблер)使用。 – 維基百科

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等進行交互,實現服務代理和負載均衡等功能。
                     +                    ^
        Http Request |                    |  Http Response
                     |                    |
    +---------+------v-----+         +----+----+
    |  Conf   | Nginx Core |         | FilterN |
    +---------+------+-----+         +----^----+
                     |                    |
                     |               +----+----+
                     |               | Filter2 |
choose a handler     |               +----^----+
based conf           |                    |
                     |               +----+----+
                     |               | Filter1 |
                     |               +----^----+
                     |                    | Generate content
               +-----v--------------------+----+
               |           Handler             |
               +-------------------------------+

Nginx本身做的工作實際很少,當它接到一個HTTP請求時,它僅僅是通過查找配置文件將此次請求映射到一個location block,而此location中所配置的各個指令則會啟動不同的模塊去完成工作,因此模塊可以看做Nginx真正的勞動工作者。通常一個 location中的指令會涉及一個handler模塊和多個filter模塊(當然,多個location可以復用同一個模塊)。handler模塊負責處理請求,完成響應內容的生成,而filter模塊對響應內容進行處理。

Copyright © Linux教程網 All Rights Reserved