成人AV在线无码|婷婷五月激情色,|伊人加勒比二三四区|国产一区激情都市|亚洲AV无码电影|日av韩av无码|天堂在线亚洲Av|无码一区二区影院|成人无码毛片AV|超碰在线看中文字幕

APACHE及DSO模塊工作原理詳解

APACHE 及DSO 模塊工作原理詳解Apache HTTP Server(簡(jiǎn)稱Apache )是Apache 軟件基金會(huì)的一個(gè)開放源碼的網(wǎng)頁服務(wù)器,可以在大多數(shù)計(jì)算機(jī)操作系統(tǒng)中運(yùn)行,由于其多平臺(tái)和

APACHE 及DSO 模塊工作原理詳解

Apache HTTP Server(簡(jiǎn)稱Apache )是Apache 軟件基金會(huì)的一個(gè)開放源碼的網(wǎng)頁服務(wù)器,可以在大多數(shù)計(jì)算機(jī)操作系統(tǒng)中運(yùn)行,由于其多平臺(tái)和安全性被廣泛使用,是最流行的Web 服務(wù)器端軟件之一。它快速、可靠并且可通過簡(jiǎn)單的API 擴(kuò)展,將Perl/Python等解釋器編譯到服務(wù)器中。專職優(yōu)化、域名注冊(cè)、網(wǎng)站空間、虛擬主機(jī)、服務(wù)器托管、vps 主機(jī)、服務(wù)器租用的中國(guó)信息港在這里為你做詳細(xì)介紹!

本文闡述如何使用DSO 模塊及其工作原理。

工作原理

DSO 是Dynamic Shared Objects(動(dòng)態(tài)共享目標(biāo))的縮寫,它是現(xiàn)代Unix 派生出來的操作系統(tǒng)都存在著的一種動(dòng)態(tài)連接機(jī)制。它提供了一種在運(yùn)行時(shí)將特殊格式的代碼,在程序 運(yùn)行需要時(shí),將需要的部分從外存調(diào)入內(nèi)存執(zhí)行的方法。Apache 在1.3以后的版本后開始支持它。因?yàn)锳pache 早就使用一個(gè)模塊概念來擴(kuò)展它的功能 并且在內(nèi)部使用一個(gè)基于調(diào)度的列表來鏈接擴(kuò)展模塊到Apache 核心模塊. 所以,Apache 早就注定要使用DSO 來在運(yùn)行時(shí)加載它的模塊。

讓我們先來看一下Apache 本身的程序結(jié)構(gòu):這是一個(gè)很復(fù)雜的四層結(jié)構(gòu)--每一層構(gòu)建在下一層之上。

第四層是用Apache 模塊開發(fā)的第三方庫--比如open ssl 一般來說在Apache 的官方發(fā)行版中這層是空的,但是在實(shí)際的Apache 結(jié)構(gòu)中這些庫構(gòu)成的層結(jié)構(gòu)肯定是存在的。

第三層是一些可選的附加功能模塊--如mod_ssl,mod_perl。這一層的每個(gè)模塊通常實(shí)現(xiàn)的是Apache 的一個(gè)獨(dú)立的分離的功能而事實(shí)上這些模塊沒有一個(gè)是必須的,運(yùn)行一個(gè)最小的Apache 不需要任何一個(gè)此層的模塊。

第二層是Apache 的基本功能庫-這也是Apache 的核心本質(zhì)層--這層包括Apache 內(nèi)核,http_core(Apache的核心模 塊), 它們實(shí)現(xiàn)了基本HTTP 功能(比如資源處理(通過文件描述符和內(nèi)存段等等),保持預(yù)生成(pre-forked) 子進(jìn)程模型,監(jiān)聽已配置的虛擬服務(wù) 器的TCP/IP套接字,傳輸HTTP 請(qǐng)求流到處理進(jìn)程,處理HTTP 協(xié)議狀態(tài),讀寫緩沖,此外還有附加的許多功能比如URL 和MIME 頭的解析及DSO 的裝載等),也提供了Apache 的應(yīng)用程序接口(API) (其實(shí)Apache 的真正功能還是包含在內(nèi)部模塊中的,為了允許這些模塊完全控制Apache 進(jìn)程,內(nèi)核必須提供API 接口), 這層也包括了一般性的可用代碼庫(libap) 和實(shí)現(xiàn)正則表達(dá)式匹配的庫(libregex) 還有就是一個(gè)小的操作系統(tǒng) 的抽象庫(libos) 。

最低層是與OS 相關(guān)的平臺(tái)性應(yīng)用函數(shù),這些OS 可以是不同現(xiàn)代UNIX 的變種,win32,os/2,MacOS甚至只要是一個(gè)POSIX 子系統(tǒng)。

,

圖1 apache模塊功能分層

在這個(gè)復(fù)雜的程序結(jié)構(gòu)中有趣的部分是---事實(shí)上第三層和第四層與第二層之間是松散的連接,而另一方面第三層的模塊間是互相依賴的--因這種結(jié) 構(gòu)造成的顯著影響就是第三層和第四層的代碼不能靜態(tài)地連接到最低層平臺(tái)級(jí)的代碼上。因此DSO 模式就成了解決它的一種手段。結(jié)合DSO 功能,這個(gè)結(jié)構(gòu)就變 得很靈活了,可以讓Apache 內(nèi)核(從技術(shù)上說應(yīng)該是mod_so模塊而不是內(nèi)核)在啟動(dòng)時(shí)(而不是安裝時(shí))裝載必要的部分以實(shí)現(xiàn)第三層和第四層的功 能。 現(xiàn)代類Unix 的系統(tǒng)都有一種叫動(dòng)態(tài)共享對(duì)象(DSO)的動(dòng)態(tài)連接/加載的巧妙的機(jī)制,從而可以在運(yùn)行時(shí)刻,將編譯成特殊格式的代碼加載到一個(gè)可執(zhí)行程序的地址空間。

加載的方法通常有兩種:其一是,在可執(zhí)行文件啟動(dòng)時(shí)由系統(tǒng)程序ld.so 自動(dòng)加載;其二是,在執(zhí)行程序中手工地通過Unix 加載器的系統(tǒng)接口執(zhí)行系統(tǒng)調(diào)用dlopen()/dlsym()以實(shí)現(xiàn)加載。

按第一種方法,DSO 通常被稱為共享庫(shared libraries) 或者DSO 庫(DSO libraries) ,使用libfoo.so 或者libfoo.so.1.2的文件名,被存儲(chǔ)在系統(tǒng)目錄中(通常是/usr/lib),并在編譯安裝 時(shí),使用連接器參數(shù)-lfoo 建立了指向可執(zhí)行程序的連接。通過設(shè)置連接器參數(shù)-R 或者環(huán)境變量LD_LIBRARY_PATH,庫中硬編碼了可執(zhí)行文件 的路徑,使Unix 加載器能夠定位到位于/usr/lib的libfoo.so ,以解析可執(zhí)行文件中尚未解析的位于DSO 的符號(hào)。

通常,DSO 不會(huì)引用可執(zhí)行文件中的符號(hào)(因?yàn)樗峭ㄓ么a的可重用庫) ,也不會(huì)有后繼的解析動(dòng)作。可執(zhí)行文件無須自己作任何動(dòng)作以使用DSO 中的符號(hào),而完全由Unix 加載器代辦(事實(shí)上,調(diào)用ld.so 的代碼是被連入每個(gè)可執(zhí)行文件的非靜態(tài)運(yùn)行時(shí)刻啟動(dòng)代碼的一部分) 。動(dòng)態(tài)加載公共庫代碼的 優(yōu)點(diǎn)是明顯

,

的:只需要在系統(tǒng)庫libc.so 中存儲(chǔ)一個(gè)庫代碼,從而為每個(gè)程序節(jié)省了磁盤存儲(chǔ)空間。

按第二種方法,DSO 通常被稱為共享對(duì)象(shared objects)或者DSO 文件(DSO files) ,可以使用任何文件名(但是規(guī)范的名稱是foo.so) ,被存儲(chǔ)在程序特定的目錄中,也不會(huì)自動(dòng)建立指向其所用的可執(zhí)行文件的連接,而由可執(zhí) 行文件在運(yùn)行時(shí)自己調(diào)用dlopen()來加載DSO 到其地址空間,同時(shí)也不會(huì)進(jìn)行為可執(zhí)行文件解析DSO 中符號(hào)的操作。Unix 加載器會(huì)根據(jù)可執(zhí)行程序 的輸出符號(hào)表和已經(jīng)加載的DSO 庫自動(dòng)解析DSO 中尚未解析的符號(hào)(尤其是無所不在的

libc.so 中的符號(hào)) ,如此DSO 就獲得了可執(zhí)行程序的符號(hào)信 息,就好象是被靜態(tài)連接的。

最后,為了利用DSO API 的優(yōu)點(diǎn),執(zhí)行程序必須用dlsym()解析DSO 中的符號(hào),以備稍后在諸如指派表等中使用。也就是說,執(zhí)行程序必須自己解析其所需的符號(hào)。這種機(jī)制 的優(yōu)點(diǎn)是允許不加載可選的程序部件,直到程序需要的時(shí)候才被動(dòng)態(tài)地加載(也就不需要內(nèi)存開銷) ,以擴(kuò)展程序的功能。

雖然這種DSO 機(jī)制看似很直接,但至少有一個(gè)難點(diǎn),就是在用DSO 擴(kuò)展程序功能(即第二種方法) 時(shí)為DSO 對(duì)可執(zhí)行程序中符號(hào)的解析,這是因 為,“反向解析”可執(zhí)行程序中的DSO 符號(hào)在所有標(biāo)準(zhǔn)平臺(tái)上與庫的設(shè)計(jì)都是矛盾的(庫不會(huì)知道什么程序會(huì)使用它) 。實(shí)際應(yīng)用中,可執(zhí)行文件中的全局符號(hào)通 常不是重輸出的,因此不能為DSO 所用。所以在運(yùn)行時(shí)刻用DSO 來擴(kuò)展程序功能,就必須找到強(qiáng)制連接器輸出所有全局符號(hào)的方法。

共享庫是一種典型的解決方法,因?yàn)樗螪SO 機(jī)制,而且為操作系統(tǒng)所提供的幾乎所有類型的庫所使用。另一方面,使用共享對(duì)象并不是許多程序?yàn)閿U(kuò)展其功能所采用的方法。

截止到1998年,只有少數(shù)軟件包使用DSO 機(jī)制在運(yùn)行時(shí)刻實(shí)際地?cái)U(kuò)展其功能,諸如Perl 5(通過其XS 機(jī)制和DynaLoader 模塊), Netscape Server 等。從

1.3版本開始,Apache 也加入此列,因?yàn)锳pache 已經(jīng)用了基于指派表

(dispatch-list-based)的方法來連 接外部模塊到Apache 的核心。所以,Apache 也就當(dāng)然地在運(yùn)行時(shí)刻用DSO 來加載其模塊。

優(yōu)點(diǎn)和缺點(diǎn)

上述基于DSO 的功能有如下優(yōu)點(diǎn):

由于服務(wù)器包的裝配工作可以在運(yùn)行時(shí)刻使用httpd.conf 的配置命令

LoadModule 來進(jìn)行,而不是在編譯中使用configure 來進(jìn)行,因此顯得更靈活。比如:只需要安裝一個(gè)Apache ,就可以運(yùn)行多個(gè)不同的服務(wù)器實(shí)例(如標(biāo)準(zhǔn)&SSL版本,濃縮的&功能加強(qiáng)版 本[mod_perl, PHP3],等等) 。

,

服務(wù)器包可以在安裝后使用第三方模塊被輕易地?cái)U(kuò)展。這至少對(duì)廠商發(fā)行包的維護(hù)者有巨大的好處,他可以建立一個(gè)Apache 核心包,而為諸如PHP3, mod_perl, mod_fastcgi等擴(kuò)展另建附加的包。

更簡(jiǎn)單的Apache 模塊原型。使用DSO 配合apxs ,可以脫離Apache 源代碼樹,僅需要一個(gè)apxs -i 和一個(gè)apachectl restart 命令,把開發(fā)的模塊新版本納入運(yùn)行中的Apache 服務(wù)器。

DSO 有如下缺點(diǎn):

由于并不是所有的操作系統(tǒng)都支持動(dòng)態(tài)加載代碼到一個(gè)程序的地址空間,因此DSO 機(jī)制并不能用于所有的平臺(tái)。

由于Unix 加載器有必須進(jìn)行的符號(hào)解析的開銷,服務(wù)器的啟動(dòng)會(huì)慢20左右。

在某些平臺(tái)上,獨(dú)立位置代碼(positon independent code[PIC])有時(shí)需要復(fù)雜的匯編語言技巧來實(shí)現(xiàn)相對(duì)尋址,而絕對(duì)尋址則不需要,因此服務(wù)器在運(yùn)行時(shí)會(huì)慢5左右。

由于DSO 模塊不能在所有平臺(tái)上為其他基于DSO 的庫所連接(ld -lfoo) ,比如,基于a.out 的平臺(tái)通常不提供此功能,而基于ELF 的平臺(tái)則提供,因此DSO 機(jī)制并不能被用于所有類型的模塊?;蛘呖梢赃@樣說,編 譯為DSO 文件的模塊只能使用由Apache 核心、C 庫(libc)和Apache 核心所用的所有其他動(dòng)態(tài)或靜態(tài)的庫、含有獨(dú)立位置代碼的靜態(tài)庫 (libfoo.a)所提供的符號(hào)。而要使用其他代碼,就只能確保Apache 核心本身包含對(duì)此代碼的引用,或者自己用dlopen()來加載此代碼。

模塊實(shí)現(xiàn)

相關(guān)模塊 相關(guān)指令

mod_so

LoadModule

Apache 對(duì)獨(dú)立模塊的DSO 支持是建立在被靜態(tài)編譯進(jìn)Apache 核心的mod_so模塊基礎(chǔ)上的,這是core 以外唯一不能作為DSO 存 在的模塊,而其他所有已發(fā)布的Apache 模塊,都可以通過安裝文檔中闡述的配置選項(xiàng)

--enable-module=shared,被獨(dú)立地編譯成 DSO并使之生效。一個(gè)被編譯為mod_foo.so的DSO 模塊,可以在httpd.conf 中使用mod_so的LoadModule 指令,在服務(wù)器 啟動(dòng)或重新啟動(dòng)時(shí)被加載。

用命令行參數(shù)-l 可以查看已經(jīng)編譯到服務(wù)器中的模塊。

,

新提供的支持程序apxs(APache eXtenSion) 可以在Apache 源代碼樹以外編譯基于DSO 的模塊,從而簡(jiǎn)化Apache DSO模塊的建立過程。其原理很簡(jiǎn)單:安裝Apache 時(shí),配置命令make install會(huì)安裝Apache C頭文件,并把依賴于平臺(tái)的編譯器和連接器參數(shù)傳給apxs 程序,使用戶可以脫離Apache 的發(fā)布源代碼樹編譯其模塊源代碼,而不改變支持DSO 的編譯 器和連接器的參數(shù)。 用法概要

Apache 2.0的DSO 功能簡(jiǎn)要說明:

編譯并安裝已發(fā)布的Apache 模塊,比如編譯mod_foo.c為mod_foo.so的DSO 模塊:

$ ./configure --prefix=/path/to/install --enable-foo=shared $ make install

編譯并安裝第三方Apache 模塊, 比如編譯mod_foo.c為mod_foo.so的DSO 模塊:

$ ./configure --add-module=module_type:/path/to/3rdparty/mod_foo.c --enable-foo=shared

$ make install

配置Apache 以便共享后續(xù)安裝的模塊:

$ ./configure --enable-so

$ make install

用apxs 在Apache 源代碼樹以外編譯并安裝第三方Apache 模塊,比如編譯mod_foo.c為mod_foo.so的DSO 模塊:

$ cd /path/to/3rdparty

$ apxs -c mod_foo.c

$ apxs -i -a -n foo mod_foo.la

中國(guó)信息港是全國(guó)十大品牌服務(wù)商,專業(yè)虛擬主機(jī), 域名注冊(cè),VPS 主機(jī), 香港虛擬主機(jī), 香港空間, 服務(wù)器租用托管, 雙線服務(wù)器, 網(wǎng)站空間, 雙線虛擬主機(jī), 純FTP 主機(jī), 虛擬主機(jī), 網(wǎng)站建設(shè)。

標(biāo)簽: