詳細全面介紹什麽是Apache服務器?
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的特點,漏洞總能被很快修補。因此總的來說,其安全性還是相當高的。
()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的性能還是不錯的.
請求30次redis和請求30次數據庫哪個更快?
純內存數據庫,如果只是簡單的key-value,內存不是瓶頸。壹般情況下,hash查找可以達到每秒數百萬次的數量級。瓶頸在於網絡IO上。
根據妳測的的10000/s來看,客戶端和redis應該是部署在兩臺不同的機器,並且是使用同步的方式請求redis.每次請求需要通過網絡把請求發送到redis所在的機器,然後等待redis返回數據。
時間大部分消耗在網絡傳輸中。
如果把redis和客戶端放在同壹臺機器,網絡延遲會更小,壹般情況下可以打到60000次每秒甚至更高,取決於機器性能。
鎖不是影響性能的主要因素。
線程鎖(mutex_lock)只有在遇到沖突的情況下性能會下降,而正常情況下,遇到沖突的概率很低。
如果只是簡單的加鎖、釋放鎖速度是非常快的,每秒鐘上千萬次沒問題。
memcache內部用到了大量的鎖,並沒有見到性能降低。
線程也不是影響吞吐量的重要因素。
如第壹點來說,壹般情況下,程序處理內存數據的速度遠高於網卡接收的速度。
使用線程好處是可以同時處理多條連接,在極端情況下,可能會提高響應速度。
使用epoll或libevent等因為異步非阻塞IO編程只能這麽做。
與之對應的是同步阻塞IO編程,使用多進程或多線程實現多條連接的處理,比如apache。
壹般情況下,異步非阻塞IO模型性能是遠高於同步阻塞IO模型的,可以參考nginx與apache性能的對比。
libevent並不比redis自己實現的ae_event慢,代碼多是應為ae_event只實現了redis需要的功能,而libevent則具有更多的功能,比如更快的定時器、bufferevent模型,甚至自帶了DNS、HTTP協議的處理。
並且libevent更通用,而redis只專註於linux平臺。最後題主問題,快在哪?
1、純內存操作2、異步非阻塞IO
如何使用Linux提供的信號量來實現進程的互斥和同步?
設互斥信號量mutex初值為1,進程執行操作前P(mutex),操作完成後V(mutex)。P操作使mutex減1,如果mutex
(以前過的關於PV操作的答案壹個,妳看看有用沒)