Apache 體系結構

2021-06-23 08:28:50 字數 4475 閱讀 6166

1. apache的目錄結構 (httpd2.0為例)

httpd源**檔案有2000個,包括180多個目錄

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

----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的測試函式

2. 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的大部分模組是可選擇的,可以有也可以沒有,但是有兩個模組是必須的,即: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,是第三方庫。

3. 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 plain

copy

for(;;)    

(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 模組將開始對該報文進行解析,請求的解析包括:

讀取的請求資訊會儲存在資料結構 request_rec 中。

(3) 請求處理

對於http報文,apache呼叫ap_process_request 函式對請求進行實質處理,apache中請求處理包括三個階段:請求解析階段、安全處理階段、請求準備階段,而每乙個階段也可以細分多個子階段

請求解析階段:

a) url字元轉義

通常情況下,瀏覽器會自動轉換請求位址列中一些特殊字元,比如空格(%20),而對伺服器而言,它就要將%xx 格式的字串重新還原成原來的字串

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

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呼叫對應的處理器生成客戶請求的內容;生成內容會進入過濾器進行內容過濾(自己設定過濾的內容和規則),通過最後乙個過濾器(網路過濾器後),把內容傳送到網路,最後傳輸到客戶端,並在瀏覽器中顯示。

mysql 體系結構 了解MySQL體系結構

mysql 資料庫體系結構圖 mysql 由以下幾部分組成 1 connectors 不同語言中與 sql 的互動 show variables like connection variable name value character set connection utf8 collation c...

簡述mysql體系結構 MySQL體系結構

一 mysql登入方式 一 tcp ip方式 遠端 本地 mysql uroot poldboy123 h 10.0.0.51 p3306 二 socket方式 mysql uroot poldboy123 s tmp mysql.sock 二 例項介紹 例項 mysqld後台守護程序 主線程 ma...

軟體體系結構 軟體體系結構概論

開學到現在我已經上了三節軟體體系結構的課程,現在我想把自己學到的整理歸納一下。此篇隨筆對應於教材軟體體系結構概論一章。首先談一談我剛接觸這門課程是的感受。那就是 我靠 軟體也會有體系結構?以前只學過資料結構 演算法 基本的程式語言,覺得程式設計無非就是使用者給我需求,我便按照需求來程式設計序就好,從...