apache 運行機制

Apache運行機制剖析:

1、B/S交互過程

瀏覽器(Browser)和服務器(Web Server)的交互過程:

 

1、  瀏覽器向服務器發出HTTP請求(Request)。

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

3、  瀏覽器收到服務器的響應數據,經過分析處理,將最終結果顯示在瀏覽器中。

 下圖是一份瀏覽器請求數據和服務器響應數據的快照:

 

關於瀏覽器和服務器數據交互過程非常簡單,很容易理解。我想從事Web開發的人員都很清楚,在此不再贅述,僅供參考。

2、Apache概述

Apache是目前世界上使用最爲廣泛的一種Web Server,它以跨平臺、高效和穩定而聞名。按照去年官方統計的數據,Apache服務器的裝機量佔該市場60%以上的份額。尤其是在 X(Unix/Linux)平臺上,Apache是最常見的選擇。其它的Web Server產品,比如IIS,只能運行在Windows平臺上,是基於微軟.Net架構技術的不二選擇。

Apache並不是沒有缺點,它最爲詬病的一點就是變得越來越重,被普遍認爲是重量級的 WebServer。所以,近年來又涌現出了很多輕量級的替代產品,比如lighttpd,nginx等等,這些WebServer的優點是運行效率很 高,但缺點也很明顯,成熟度往往要低於Apache,通常只能用於某些特定場合,。

3、Apache組件邏輯圖

Apache是基於模塊化設計的,總體上看起來代碼的可讀性高於php的代碼,它的核心代碼 並不多,大多數的功能都被分散到各個模塊中,各個模塊在系統啓動的時候按需載入。你如果想要閱讀Apache的源代碼,建議你直接從main.c文件讀 起,系統最主要的處理邏輯都包含在裏面。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的邏輯構成以及與操作系統的關係

 4、Apache的生命週期

這一節的內容會與php模塊的載入有關,您可以略微關注一下。以下是Apache的生命週期(prefork模式)示意圖。

5.Apache的運行

Apache運行分爲啓動階段和運行階段。

5.1.    啓動階段

在啓動階段,Apache主要進行配置文件解析(例如http.conf以及Include指令設定的配置文件等)、模塊加載(例如mod_php.so,mod_perl.so等)和系統資源初始化(例如日誌文件、共享內存段等)工作。

在這個階段,Apache爲了獲得系統資源最大的使用權限,將以特權用戶root(X系統)或超級管理員administrator(Windows系統)完成啓動。


Apache和“php處理機”的裝配過程就是在這個階段完成的。

“php處理機”就是負責解釋和執行你的php代碼的系統模塊。這個名字是我特意創造的,目的是爲了幫助你理解本節的內容,後面的章節還會給出更專業的名稱。


你單獨做過php的安裝配置嗎?

如果你做過類似的工作,下面的內容很容易理解;如果你沒有做過,可以嘗試安裝一下,有助於加深你的理解。不過,我的文章向來深入淺出,我會盡量把這個過程講得更淺顯一些。其實php的安裝非常簡單,如果你很感興趣的話,可以到網上隨便搜一篇安裝指南,按步驟照做就可以了。

把php最終集成到Apache系統中,還需要對Apache進行一些必要的設置。這裏,我們就以php的mod_php5 SAPI運行模式爲例進行講解,至於SAPI這個概念後面我們還會詳細講解。

假定我們安裝的版本是Apache2 和 Php5,那麼需要編輯Apache的主配置文件http.conf,在其中加入下面的幾行內容:

Unix/Linux環境下:

LoadModule php5_module modules/mod_php5.so

AddType application/x-httpd-php .php

注:其中modules/mod_php5.so 是X系統環境下mod_php5.so文件的安裝位置。

 

Windows環境下:

LoadModule php5_module d:/php/php5apache2.dll

AddType application/x-httpd-php .php

注:其中d:/php/php5apache2.dll 是在Windows環境下php5apache2.dll文件的安裝位置。

這兩項配置就是告訴Apache Server,以後收到的Url用戶請求,凡是以php作爲後綴,就需要調用php5_module模塊(mod_php5.so/ php5apache2.dll)進行處理。

 

這個過程可以參考以下的示意圖:

Apache啓動階段的源碼包含在server/main.c中,我整理了一下源碼中的對應關係:

不熟悉unix/linux的同學可能會問so文件(mod_php5.so)是個什麼樣的文件?

unix/linux下,so後綴文件是一個DSO文件,DSO與windows系統下的dll是等價概念,都是把一堆函數封裝在一個二進制文件中。調用它們的進程把它們裝入內存後,會將其映射到自己的地址空間。

DSO全稱爲Dynamic Shared Object,即動態共享對象。DLL全稱爲Dynamic Link Library 即動態鏈接庫。

Apache 服務器的體系結構的最大特點,就是高度模塊化。如果你爲了追求處理效率,可以把這些dso模塊在apache編譯的時候靜態鏈入,這樣會提高Apache 5%左右的處理性能。

5.2、運行階段

     5.2.1 運行階段概述

    在運行階段,Apache主要工作是處理用戶的服務請求。

    在這個階段,Apache放棄特權用戶級別,使用普通權限,這主要是基於安全性的考慮,防止由於代碼的缺陷引起的安全漏洞。象微軟的IIS就曾遭受“紅色代碼(Code Red)”和“尼姆達(Nimda)”等惡意代碼的溢出攻擊。

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

 

     Apache Hook機制

     Apache的Hook機制是指:Apache 允許模塊(包括內部模塊和外部模塊,例如mod_php5.so,mod_perl.so等)將自定義的函數注入到請求處理循環中。換句話說,模塊可以在 Apache的任何一個處理階段中掛接(Hook)上自己的處理函數,從而參與Apache的請求處理過程。


    mod_php5.so/ php5apache2.dll就是將所包含的自定義函數,通過Hook機制注入到Apache中,在Apache處理流程的各個階段負責處理php請求。

 

    關於Hook機制在Windows系統開發也經常遇到,在Windows開發既有系統級的鉤子,又有應用級的鉤子。常見的翻譯軟件(例如金山詞霸等等)的 屏幕取詞功能,大多數是通過安裝系統級鉤子函數完成的,將自定義函數替換gdi32.dll中的屏幕輸出的繪製函數。

 

    Apache請求處理循環詳解
    Apache請求處理循環的11個階段都做了哪些事情呢?
   

    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一次請求處理的最後一個階段。

 

    模塊的注入Apache的過程可以參考源碼中server/core.c文件:
 

    mod_php5.so/ php5apache2.dll注入到Apache的函數中,最重要的就是Response階段的處理函數。

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