Apache服務器配置總結(二)

二、apache的模塊化

        Apache採用模塊化的體系結構,它的大部分功能都被分割成相互獨立的模塊,這樣的結構能夠經過增長和刪除模塊就能夠擴展和修改Apache提供的功能,另外一方面,對於Apache 功能的理解也變得很是容易。html

    httpd源代碼文件有2000個,包括180多個目錄數據庫

    httpd2.0apache

    ----server :此目錄是整個Apache核心功能實現,包括請求處理、協議處理等,此目錄下面還包括多線程處理模塊(mpm),主要是用來實現多線程併發的。windows

    ----modules:包括Apache全部的模塊,並且一個模塊佔用一個目錄  mod_ssl  mod_proxy mod_perl瀏覽器

    ----include:Apache必需的頭文件,包括一些極其重要的頭文件 http_main.h   http_protocol.h http_request.h 等安全

    ----os :操做系統平臺依賴文件服務器

    ----srclib:Apache開發和運行須要的基礎庫,主要包括 apr_util  apr 和 pcre網絡

    ----support:用於輔助Apache的小工具 tools數據結構

    ----test:APR的測試函數多線程

    

Apache 的核心組件

Apache的核心組件包括 配置文件組件(http_config)、進程併發組件(MPM)、鏈接處理組件(http_connection)、HTTP協議處理組件(http_protocol)、HTTP請求處理組件(http_request)、HTTP核心組件(http_core)、核心模塊組件(mod_core) 共七部分。七大組件直接不少都是相互調用的關係,好比MPM與HTTP_core相互調用,可是http_config

是單向調用其餘幾個組件,而後 main()函數調用http_config組件。除了上述說的七個核心組件還有日誌處理組件、虛擬主機處理組件,以及過濾模塊組件。

(1) main.c

Apache是用C語言開發的,main.c是全部程序的入口,main()函數也包括不少處理操做,包括配置文件、虛擬主機配置等,還有一個處理併發的主循環,在主循環中Apache所作的事情就是執行MPM模塊,MPM將產生多個進程或多個線程來Listen 指定端口(80 443),並處理該端口上的鏈接和請求。具體代碼以下:

[html] view plaincopy

  1. for(;;)  

  2. {  

  3.      ....  

  4.      if(ap_mpm_run())  

  5.         break;  

  6.      ....  

  7. }  


(2) HTTP請求處理組件

子請求:在併發量比較高的網站,對一個特定的請求,爲了加快處理速度,會從當前請求中派生出多個子請求,由這些子請求去併發地處理,(好比:mod_autoindex 模塊進行索引的時候會針對目錄中的每個文件產生一個子請求);當子請求處理完畢後再返回到父請求中。

重定向請求:apache處理請求時,當前的請求可能會被重定向(訪問一個網頁會先跳轉到登陸頁面),重定向時當前定向會產生新的請求,由新請求繼續處理。

4. Apache運行流程

(1) Apache啓動過程

 apache的啓動包括兩個階段,高權限啓動階段和低權限運行階段,一般稱之爲兩階段啓動方式。

apache中的絕大部份內存都是基於內存池分配的,在apache啓動時必須首先初始化內存池資源;而後apache會讀取和解析apache的配置文件(httpd.conf) ;在啓動的最後階段,apache將經過調用ap_mpm_run函數並將控制權交給MPM,只有當MPM執行失敗或結束後才把控制權交還給主程序,並且MPM在處理HTTP鏈接時用的權限是普通用戶的權限,這樣會避免黑客攻擊apache會獲取root權限。

MPM有兩種併發方式:prefork  worker,其中 prefork是以進程爲基本單位,每個請求可能會產生多個進程,這樣若是在window系統中,一個進程佔的資源比較大,這樣apache負載的併發就比較小;因此在Linux系統中是prefork模式,在window系統中通常採用 worker模式。

(2) Apache 連接處理

在收到client端的HTTP請求並創建socket鏈接後,apache就獲取了client對應的IP,經過這個IP能夠肯定該IP地址對應的虛擬主機族(?),讓回更新相關的虛擬主機的相關信息。

一旦client與Apache創建鏈接,請求數據將被讀取出來,而後HTTP_PROTOCOL 模塊將開始對該報文進行解析,請求的解析包括:

  • HTTP請求頭:  GET index.html  HTTP/1.1

  • HTTP請求域:  Accept:*/*

  • HTTP請求體:對一些特殊的請求,好比POST 會在報文中保存數據

讀取的請求信息會保存在數據結構 request_rec 中。

(3) 請求處理

對於HTTP報文,Apache調用ap_process_request 函數對請求進行實質處理,Apache中請求處理包括三個階段:請求解析階段、安全處理階段、請求準備階段,而每個階段也能夠細分多個子階段

請求解析階段:

a) URL字符轉義

一般狀況下,瀏覽器會自動轉換請求地址欄中一些特殊字符,好比空格(%20),而對服務器而言,它就要將%xx 格式的字符串從新還原成原來的字符串

b) 優化 URL :有時URL中包括一下多餘的/    http://www.baidu.com/...//   這樣把多餘的/ 給刪除,把相對路徑的 ../   ./ 都換成絕對路徑

c) URL名稱轉換:若是在apache上面有alias,若是URL是一個別名就把它轉換爲真實的域名 URL

d) URL重定向:若是apache裏面有配置文件 rewrite 設置,則把請求的URL進行重定向到新的 URL

安全處理:

 就是前面說的 AAA認證,不過這裏是具體實現(掛鉤對應的模塊進行訪問控制、身份認證、用戶受權)

請求準備階段:

a) type_checker:apache在處理客戶請求的資源前,先要肯定用戶請求資源的類型(html txt gif ),而後再進行內容生成

b) fixups:補丁修復,apache開發須要近現代其餘優化操做能夠在這裏實現

 

(4) 內容生成

請求處理最重要的內容就是響應內容生成,對於靜態的HTML文件直接讀取文件返回給客戶端就能夠了;對對一些腳本CGI、js還有一下動態數據庫文件,須要apache調用對應的處理器生成客戶請求的內容;生成內容會進入過濾器進行內容過濾(本身設置過濾的內容和規則),經過最後一個過濾器(網絡過濾器後),把內容發送到網絡,最後傳輸到客戶端,並在瀏覽器中顯示。


    Apache 層次結構

        Apache 能夠分爲5層,分別是 操做系統平臺功能層,可移植運行庫層(操做系統適配層),Apache核心功能層,Apache可選功能層和Apache第三方功能庫

        (1) 操做系統平臺功能層:

            Apache實質上仍是運行在操做系統上面的應用程序,所以必須使用操做系統自己提供的底層功能,好比進程和線程、進程和線程的通訊,網絡套接字通訊和文件操做等

同事Apache也是跨平臺(能夠在不一樣的操做系統上運行)

        (2) 可移植運行庫(APR)

            APR(Apache portable runtime) 是操做系統的適配層,經過APR也實現了Apache的跨平臺。由於不一樣的操做系統提供的底層API不一樣,也就是實現同一個操做所用的函數方法不一樣,這時在Apache和操做系統中間設計一個APR,這樣APR根據不一樣的操做系統分別實現一個相同的功能,這樣apache能夠調用APR的提供的一個API接口。


    

這樣,若是Apache要建立一個進程,這時會調用 APR中的 apr_proc_create()函數,此時APR會自動識別操做系統的類型根據不一樣的類型調用操做系統經過的API,如是Unix系列則會調用unix中的fork()方法實現建立進程;若是是windows系統,則調用createProcess()建立進程。

因此,Apache在處理與操做系統有關的事物時,不用考慮是基於哪個操做系統,直接用APR的統一API接口就可,具體的由APR來實現跨操做系統。

實際上任何應用程序均可以藉助APR進行跨平臺。

(3) 核心功能層

a) 核心功能層主要實現Apache的基本功能和核心功能,包括讀取和響應HTTP請求,處理HTTP協議;核心功能層包括核心程序和核心模塊

核心程序主要是實現Apache的基本功能:

啓動和終止apache

處理配置文件(config.c)

接受和處理HTTP鏈接

讀取HTTP請求並對該請求進行處理

處理HTTP協議

核心功能層另外一個是 核心模塊,apache的大部分模塊是可選擇的,能夠有也能夠沒有,可是有兩個模塊是必須的,即:mod_core和 mod_so

mod_core:負責處理配置文件中的大部分配置指令,並根據這些指令運行apache

mod_so:負責在須要的時候動態加載其他模塊,缺乏了該模塊其餘模塊沒法加載

多進程併發處理模塊MPM(這裏理解一個client請求成功並創建一個TCP鏈接,則這是一個進程),MPM雖然hi能夠選擇的,可是如今apache必需要用到多進程併發,因此這個模塊也是必須的模塊

 b) Apache 最基本的核心功能由apache 核心完成,除此以外,核心沒法提供的功能則所有由模塊提供。爲了容許這些模塊能完成控制apache的處理,apache核心程序提供了對應的API;這些API是指每一個模塊中包含的一系列的函數(核心程序處理HTTP請求的時候用來將信息傳遞給模塊),以及一些列apr的函數。

(4) 可選功能層

Apache有不少模塊,包括mod_ssl mod_proxy mod_perl ;apache的文件都是C語言開發的,若是有perl腳本寫的模塊,必須把mod_perl 模塊加載,不然不能運行

(5) 第三方支持庫

apahe的一些模塊會使用到第三方的開發庫,好比 mod_ssl 使用了 openssl;mod_perl 使用了perl 開發庫,這些庫並不屬於apache,是第三方庫。

相關文章
相關標籤/搜索