天天看點

apache 運作機制 1、B/S互動過程 2、Apache概述 3、Apache元件邏輯圖  4、Apache的生命周期 5.Apache的運作

Apache運作機制剖析:

1、B/S互動過程

浏覽器(Browser)和伺服器(Web Server)的互動過程:

apache 運作機制 1、B/S互動過程 2、Apache概述 3、Apache元件邏輯圖  4、Apache的生命周期 5.Apache的運作

1、  浏覽器向伺服器發出HTTP請求(Request)。

2、  伺服器收到浏覽器的請求資料,經過分析處理,向浏覽器輸出響應資料(Response)。

3、  浏覽器收到伺服器的響應資料,經過分析處理,将最終結果顯示在浏覽器中。

 下圖是一份浏覽器請求資料和伺服器響應資料的快照:

apache 運作機制 1、B/S互動過程 2、Apache概述 3、Apache元件邏輯圖  4、Apache的生命周期 5.Apache的運作

關于浏覽器和伺服器資料互動過程非常簡單,很容易了解。我想從事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 運作機制 1、B/S互動過程 2、Apache概述 3、Apache元件邏輯圖  4、Apache的生命周期 5.Apache的運作

Apache的邏輯構成以及與作業系統的關系

 4、Apache的生命周期

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

apache 運作機制 1、B/S互動過程 2、Apache概述 3、Apache元件邏輯圖  4、Apache的生命周期 5.Apache的運作

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 運作機制 1、B/S互動過程 2、Apache概述 3、Apache元件邏輯圖  4、Apache的生命周期 5.Apache的運作

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

apache 運作機制 1、B/S互動過程 2、Apache概述 3、Apache元件邏輯圖  4、Apache的生命周期 5.Apache的運作

不熟悉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 運作機制 1、B/S互動過程 2、Apache概述 3、Apache元件邏輯圖  4、Apache的生命周期 5.Apache的運作

     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檔案:

apache 運作機制 1、B/S互動過程 2、Apache概述 3、Apache元件邏輯圖  4、Apache的生命周期 5.Apache的運作

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