Apache,一種開放源碼的HTTP服務器,可以在大多數計算機操作系統中運行,由于其多平臺和安全性(注1)被廣泛使用,是最流行的Web服務器端軟件之一。它快速、可靠并且可通過簡單的API擴展,Perl/Python等解釋器可被編譯到服務器中。
歷史
Apache
起初由Illinois大學Urbana-Champaign的國家高級計算程序中心開發。此后,Apache
被開放源代碼團體的成員不斷的發展和加強。Apache
服務器擁有牢靠可信的美譽,已用在超過半數的因特網站中-特別是幾乎所有最熱門和訪問量最大的網站。
開始,Apache只是Netscape網頁服務器(現在是Sun
ONE)的之外的開放源代碼選擇。漸漸的,它開始在功能和速度。超越其他的基于Unix的HTTP服務器。1996年4月以來,Apache一直是
Internet上最流行的HTTP服務器:1999年5月它在57%的網頁服務器上運行;到了2005年7月這個比例上升到了69%。
作
者宣稱因為這個名字好記才在最初選擇它,但是流傳最廣的解釋是(也是最顯而易見的):這個名字來自這么一個事實:當Apache在1995年初開發的時
候,它是由當時最流行的HTTP服務器NCSAHTTPd1.3的代碼修改而成的,因此是“一個修補的(a
patchy)”服務器。然而在服務器官方網站的FAQ中是這么解釋的:“‘Apache’這個名字是為了紀念名為Apache(印地語)的美洲印第安人
土著的一支,眾所周知他們擁有高超的作戰策略和無窮的耐性”。無論怎么樣,Apache2.x分支不包含任何NCSA的代碼。
特性
Apache
支持許多特性,大部分通過編譯的模塊實現。這些特性從服務器端的編程語言支持到身份認證方案。一些通用的語言接口支持Perl,Python,Tcl,
和PHP。流行的認證模塊包括mod_access,mod_auth和mod_digest。其他的例子有SSL和TLS支持
(mod_ssl),proxy模塊,很有用的URL重寫(由mod_rewrite實現),定制日志文件
(mod_log_config),以及過濾支持(mod_include和
mod_ext_filter)。Apache日志可以通過網頁瀏覽器使用免費的腳本AWStats或Visitors來進行分析。
2.x版本
Apache的2.x版本核心在Apache1.x版本之上作出了重要的加強。這包括:線程,更好的支持非UNIX平臺(例如Windows),新的ApacheAPI,以及IPv6支持。
評價
《PCMagazine》2004年8月評出了近30年以來的10款最佳軟件產品。
他們其中或者是有過最輝煌的歷史,或者是最具創意。其對apache的評價是:第三名:Apache(阿帕奇,1995年推出)Apache目前已經演變
成了“LAMP”,即Linux、Apache、MySQL和PHP的聯合體。這是一個開放源代碼軟件項目,已經對微軟的“.NET”戰略構成嚴重威脅。
尤其是Apache網絡服務器,讓用戶充分體驗到開發源碼軟件的穩定性、可靠性和可定制性。
Apple.com評價apache時
說:Apache是服務器軟件始終不斷進化的大塊部件,它免費但又是無價之寶。Apache
是在資源開放運動中出現的絕對珍品,因為不屬于個人專利而是對公共免費。一旦擁有這些源碼,程序員能夠自由完成所想——能在其它程序員接替工作時被賦予同
樣的權限來改變和修改自己的源代碼。
注釋
盡管不斷有新的漏洞被發現,但由于其OpenSource的特點,漏洞總能被很快修補。因此總的來說,其安全性還是相當高的。
()[#page_#][#page_#]AddHandlercgi-script.cgi
AddHandlerserver-parsed.shtml
Sethandlercgi-script
AddHandler定義了何種擴展名用那一個字符串進行描述.
SetHandler把一個目錄下的文件都指定用這一個字符串描述.
我在這里提到的命令都是與其結構密切相關的.Handler和Type的關系在下面會描述的.許多的東東從外面是看不清楚的,下面,我們從里面看.
三程序的基本結構
-----------------
Apache有非常好的跨平臺性.為了實現這一目標和簡化模塊編寫者的負擔,Apache完成了許多基本的功能如IO,內存分配等,這些接口都是與具體平臺無關的.還有一些很有用的例程如:hashtable,array等.在整個體系中,Apache有一個基本點,它盡可能的使用簡單的結構和算法,這不僅易于理解和維護,還提高了它的穩定性.
在
UNIX系統上,Apache采用了多進程模型,在Window上采用了多線程模型.多進程模型中,其子進程處理客戶請求,
父進程用于管理子進程.當系統過載時父進程會再啟動幾個子進程,當系統空閑時,父進程會殺掉幾個子進程.
子進程的數目在"MinSpareServers"和"MaxSpareServers"之間.而且,每個子進程處理的請求個數也是有限制的,
這可以解決諸如內存泄漏等問題.所有的進程狀態都被記錄在sharememory中.由于每個進程的狀態記錄在其中的一小塊內存上,
它通常也只讀寫這一塊內存,因此,Apache沒有使用什么同步機制.
在RichardSteve的書上說到的幾種多進程服務器模型,Apache都使用了,在不同的系統上根據其特點選擇使用不同的方法:
1.accept:
在accept處阻塞,只有在accept是在內核級實現的才行.
2.select:
在select處阻塞.
3.mutex/lock_file:
使用mutex或lock_file來進行對accpet進行互斥.
三
種方法都要求進行阻塞,區別在于阻塞與不同的地方.前兩種方法都會由所謂的巨群問題:多個阻塞在同一個資源上的進程被同時喚醒引發再次競爭.
不過,按RichardSteve的評測,第一種方法最快,第二種其次,第三種最慢.其實,在linux上第三種方法也會有巨群問題.
Apache雖然并不強調性能,這并不意味著他們不重視性能.而是Apache認為在Server端realiable才是第一位的.但Apache的性能還是不錯的.