Apache的安裝,考慮只用于Tomcat的前段代理,處理圖片和靜態(tài)文件的請求,并把動(dòng)態(tài)請求轉(zhuǎn)發(fā)到tomcat服務(wù)處理。本文使用編譯安裝方式,把跟需求無關(guān)的模塊關(guān)閉,只使用最小的模塊編譯,提高軟件性能。
配置編譯命令請參考:
http://www.uplinux.com/download/doc/apache/ApacheManual/install.html#configure
編譯參數(shù)說明:
編譯和包含是兩個(gè)不同的概念。編譯是指這個(gè)模塊被編譯了,要想使用它,只用簡單的修改httpd.conf加上LoadModule xxx_module libexec/mod_xxx.so 明確指出。
用以前命令可以查看缺省時(shí)已編譯和包含進(jìn)去的模塊。不用顯式的--enable-MODULE[=shared] 和LoadModule 操作。就已經(jīng)可以使用的。
安裝完成后,因?yàn)榫幾g關(guān)閉了很多默認(rèn)的功能模塊,所以直接使用發(fā)布的默認(rèn)配置是不能啟動(dòng)服務(wù)器的,需要作調(diào)整。
設(shè)apache的安裝目錄為$APACHE_HOME
備份默認(rèn)配置文件$APACHE_HOME/conf/httpd.conf,然后使用highperformance.conf最為配置文件
$ mv httpd.conf httpd.conf_bak
$ cp highperformance.conf httpd.conf
$ ../bin/apachectr start
如果啟動(dòng)失敗,請屏蔽調(diào)httpd.conf中的mod_access相關(guān)命令,如Order等,關(guān)于目錄權(quán)限的控制在本例中可以使用變通方式解決,使用沒有加載目錄權(quán)限控制功能。
啟動(dòng)驗(yàn)證,訪問http://$IP/,如果正常顯示頁面,表示成功。
MPM(Multi-Processing Modules,多道處理模塊)
指定MPM的方法
$ ./configure --help|grep mpm
顯示如下:
--with-mpm=MPM
Choose the process model for Apache to use.
MPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool}
主要闡述prefork,如果不用“--with-mpm”顯式指定某種MPM,prefork就是Unix平臺上缺省的MPM,prefork本身并沒有使用到線程,2.0版使用它是為了與1.3版保持兼容性;prefork用單獨(dú)的子進(jìn)程來處理不同的請求,進(jìn)程之間是彼此獨(dú)立的,這也使其成為最穩(wěn)定的MPM之一。
prefork的工作原理是,控制進(jìn)程在最初建立“StartServers”個(gè)子進(jìn)程后,為了滿足MinSpareServers設(shè)置的需要?jiǎng)?chuàng)建一個(gè)進(jìn)程,等待一秒鐘,繼續(xù)創(chuàng)建兩個(gè),再等待一秒鐘,繼續(xù)創(chuàng)建四個(gè)……如此按指數(shù)級增加創(chuàng)建的進(jìn)程數(shù),最多達(dá)到每秒32個(gè),直到滿足MinSpareServers設(shè)置的值為止。這就是預(yù)派生(prefork)的由來。這種模式可以不必在請求到來時(shí)再產(chǎn)生新的進(jìn)程,從而減小了系統(tǒng)開銷以增加性能。
下面是prefork的默認(rèn)配置段:
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
MinSpareServers
設(shè)置了最小的空閑進(jìn)程數(shù)。
MaxSpareServers
設(shè)置了最大的空閑進(jìn)程數(shù),如果空閑進(jìn)程數(shù)大于這個(gè)值,Apache會自動(dòng)kill掉一些多余進(jìn)程。這個(gè)值不要設(shè)得過大,但如果設(shè)的值比MinSpareServers小,Apache會自動(dòng)把其調(diào)整為MinSpareServers+1。如果站點(diǎn)負(fù)載較大,可考慮同時(shí)加大MinSpareServers和MaxSpareServers。
MaxClients
MaxClients是這些指令中最為重要的一個(gè),設(shè)定的是Apache可以同時(shí)處理的請求,是對Apache性能影響最大的參數(shù)。其缺省值150是遠(yuǎn)遠(yuǎn)不夠的,如果請求總數(shù)已達(dá)到這個(gè)值(可通過ps -ef|grep http|wc -l來確認(rèn)),那么后面的請求就要排隊(duì),直到某個(gè)已處理請求完畢。這就是系統(tǒng)資源還剩下很多而HTTP訪問卻很慢的主要原因。系統(tǒng)管理員可以根據(jù)硬件配置和負(fù)載情況來動(dòng)態(tài)調(diào)整這個(gè)值。雖然理論上這個(gè)值越大,可以處理的請求就越多,但Apache默認(rèn)的限制不能大于256(在2.0中源于#define DEFAULT_SERVER_LIMIT 256)。如果把這個(gè)值設(shè)為大于256,那么Apache將無法起動(dòng)。事實(shí)上,256對于負(fù)載稍重的站點(diǎn)也是不夠的。在Apache 1.3中,這是個(gè)硬限制。如果要加大這個(gè)值,必須在“configure”前手工修改的源代碼樹下的src/include/httpd.h中查找256,就會發(fā)現(xiàn)“#define HARD_SERVER_LIMIT
MaxRequestsPerChild
設(shè)置的是每個(gè)子進(jìn)程可處理的請求數(shù)。每個(gè)子進(jìn)程在處理了“MaxRequestsPerChild”個(gè)請求后將自動(dòng)銷毀。0意味著無限,即子進(jìn)程永不銷毀。雖然缺省設(shè)為0可以使每個(gè)子進(jìn)程處理更多的請求,但如果設(shè)成非零值也有兩點(diǎn)重要的好處:可防止意外的內(nèi)存泄漏;在服務(wù)器負(fù)載下降的時(shí)侯會自動(dòng)減少子進(jìn)程數(shù)。
Apache+jk2的每個(gè)進(jìn)程的的大小是
apache_max_process_with_good_perfermance < (
apache_max_process =400 * 1.5 = 700
即最佳性能設(shè)置為:400
按照上面的分析,本系統(tǒng)的的prefork.c配置為:
通過加入mode_deflate模塊對服務(wù)器輸出壓縮傳輸,可以減小輸出壓力,節(jié)約帶寬。
可以減少40%左右的流量,減少機(jī)器用于傳輸?shù)呢?fù)載.
壓縮輸出的配置需要以下三個(gè)模塊功能支持
mod_setenvif.c
mod_deflate
mod_headers
具體說明請參考:http://www.uplinux.com/download/doc/apache/ApacheManual/mod/
配置
參考:http://www.uplinux.com/download/doc/apache/ApacheManual/mod/mod_deflate.html
# Compress everything except images
<Location />
# Insert filter
SetOutputFilter DEFLATE
# Netscape 4.x has some problems
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# Don‘t compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
# Make sure proxies don‘t deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</Location>