Apache的學(xué)習(xí)筆記
更新時(shí)間:2007年03月05日 00:00:00 作者:
版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明
http://www.chedong.com/tech/apache_install.html
關(guān)鍵詞: apache install php resin mod_gzip mod_expire webalizer cronolog
內(nèi)容摘要:
Apache是一個(gè)歷史悠久并且功能十分強(qiáng)大的WEB服務(wù)器,但其豐富的功能對(duì)于一個(gè)新手來說往往不知道從何下手。我個(gè)人感覺Apache的設(shè)計(jì)充分體現(xiàn)了模塊化設(shè)計(jì)的優(yōu)勢(shì),通過在動(dòng)態(tài)模塊加載(DSO)模式下的安裝,任何子應(yīng)用模塊都可以通過配置文件的簡(jiǎn)單修改進(jìn)行積木式的靈活配置。安裝的過程可以從簡(jiǎn)單的靜態(tài)html服務(wù)開始,一個(gè)模塊一個(gè)模塊的學(xué)習(xí)使用。從單純的HTML靜態(tài)服務(wù)(core),到復(fù)雜的動(dòng)態(tài)頁(yè)面服務(wù)(core + php, core + resin, core + php + mod_gzip, core + resin + mod_expire)。
本文主要從簡(jiǎn)化安裝==>性能調(diào)優(yōu)==>維護(hù)方便的角度,介紹了WEB服務(wù)的規(guī)劃、HTTPD安裝/應(yīng)用模塊配置、升級(jí)/維護(hù)等過程。讓Apache和PHP,Resin等應(yīng)用模塊的獨(dú)立升級(jí),完全互不影響。
WEB應(yīng)用容量規(guī)劃:根據(jù)硬件配置和WEB應(yīng)用的特點(diǎn)進(jìn)行WEB服務(wù)的規(guī)劃及一些簡(jiǎn)單的估算公式;
Apache安裝過程:apache的通用的簡(jiǎn)化安裝選項(xiàng),方便以后的應(yīng)用的模塊化配置;
修改 HARD_SERVER_LIMIT:
vi /path/to/apache_src/src/include/httpd.h
#define HARD_SERVER_LIMIT 2560 <===將原來的 HARD_SERVER_LIMIT 256 后面加個(gè)“0”
apache編譯:
./configure --prefix=/home/apache --enable-shared=max --enable-module=most
可選應(yīng)用模塊/工具的安裝:php resin mod_gzip mod_expire及各個(gè)模塊之間的配合;
mod_php安裝:./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql
mod_resin安裝:./configure --with-apxs=/home/apache/bin/apxs
mod_gzip安裝:修改Makefile中的 apxs路徑:然后make make install
工具:日志輪循工具cronolog安裝:http://www.cronolog.org
升級(jí)/維護(hù):看看通用和模塊化的安裝過程如何簡(jiǎn)化了日常的升級(jí)/維護(hù)工作;
按照以上的方法:系統(tǒng)管理員和應(yīng)用管理員的職責(zé)可以清楚的分開,互相獨(dú)立。
系統(tǒng)安裝:系統(tǒng)管理員的職責(zé)就是安裝好一臺(tái)DSO模式的Apache,然后COLON即可,
應(yīng)用安裝:由應(yīng)用管理員負(fù)責(zé)具體應(yīng)用所需要的模塊,比如PHP Resin等,并設(shè)置httpd.conf中相關(guān)的配置。
系統(tǒng)升級(jí):系統(tǒng)管理員:升級(jí)操作系統(tǒng)/升級(jí)Apache
應(yīng)用升級(jí):應(yīng)用管理員:升級(jí)應(yīng)用模塊,PHP Resin等。
WEB應(yīng)用的容量規(guī)劃
Apache主要是一個(gè)內(nèi)存消耗型的服務(wù)應(yīng)用,我個(gè)人總結(jié)的經(jīng)驗(yàn)公式:
apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5
為什么會(huì)有一個(gè)apache_max_process_with_good_perfermance和apache_max_process呢?原因是在低負(fù)載下系統(tǒng)可以使用更多的內(nèi)存用于文件系統(tǒng)的緩存,從而進(jìn)一步提高單個(gè)請(qǐng)求的響應(yīng)速度。在高負(fù)載下,系統(tǒng)的單個(gè)請(qǐng)求響應(yīng)速度會(huì)慢不少,而超過 apache_max_process,系統(tǒng)會(huì)因?yàn)殚_始使用硬盤做虛擬內(nèi)存交換空間而導(dǎo)致系統(tǒng)效率急劇下降。此外,同樣的服務(wù):2G內(nèi)存的機(jī)器的 apache_max_process一般只設(shè)置到1G內(nèi)存的1.7倍,因?yàn)锳pache本身會(huì)因?yàn)檫M(jìn)程過多導(dǎo)致性能下降。
例子1:
一個(gè)apache + mod_php的服務(wù)器:一個(gè)apache進(jìn)程一般需要4M內(nèi)存
因此在一個(gè)1G內(nèi)存的機(jī)器上:apache_max_process_with_good_perfermance < (1g / 4m) * 2 = 500
apache_max_process = 500 * 1.5 = 750
所以規(guī)劃你的應(yīng)用讓服務(wù)盡量跑在500個(gè)進(jìn)程以下以保持比較高的效率,并設(shè)置Apache的軟上限在800個(gè)。
例子2:
一個(gè)apache + mod_resin的服務(wù)器: 一個(gè)apache進(jìn)程一般需要2M內(nèi)存
在一個(gè)2G內(nèi)存的機(jī)器上:
apache_max_process_with_good_perfermance < (2g / 2m ) * 2 = 2000
apache_max_process = 2000 * 1.5 = 3000
以上估算都是按小文件服務(wù)估算的(一個(gè)請(qǐng)求一般大小在20k以下)。對(duì)于文件下載類型站點(diǎn),可能還會(huì)受其他因素:比如帶寬等的影響。
Apache安裝過程
服務(wù)器個(gè)數(shù)的硬上限HARD_SERVER_LIMIT的修改:
在Apache的源代碼中缺省的最大進(jìn)程數(shù)是256個(gè),需要修改apache_1.3.xx/src/include/httpd.h
#ifndef HARD_SERVER_LIMIT
#ifdef WIN32
#define HARD_SERVER_LIMIT 1024
#elif defined(NETWARE)
#define HARD_SERVER_LIMIT 2048
#else
#define HARD_SERVER_LIMIT 2560 <===將原來的HARD_SERVER_LIMIT 256 后面加個(gè)“0”
#endif
#endif
解釋:
Apache缺省的最大用戶數(shù)是256個(gè):這個(gè)配置對(duì)于服務(wù)器內(nèi)存還是256M左右的時(shí)代是一個(gè)非常好的缺省設(shè)置,但隨著內(nèi)存成本的急劇下降,現(xiàn)在大型站點(diǎn)的服務(wù)器內(nèi)存配置一般比當(dāng)時(shí)要高一個(gè)數(shù)量級(jí)不止。所以256個(gè)進(jìn)程的硬限制對(duì)于一臺(tái)1G內(nèi)存的機(jī)器來說是太浪費(fèi)了,而且Apache的軟上限 max_client是受限于HARD_SERVER_LIMIT的,因此如果WEB服務(wù)器內(nèi)存大于256M,都應(yīng)該調(diào)高Apache的 HARD_SERVER_LIMIT。根據(jù)個(gè)人的經(jīng)驗(yàn):2560已經(jīng)可以滿足大部分小于2G內(nèi)存的服務(wù)器的容量規(guī)劃了(Apache的軟上限的規(guī)劃請(qǐng)看后面)。
Apache的編譯:以下通用的編譯選項(xiàng)能滿足以后任意模塊的安裝
./configure --prefix=/another_driver/apache/ --enable-shared=max --enable-module=most
比如:
./configure --prefix=/home/apache/ --enable-shared=max --enable-module=most
解釋:
--prefix=/another_driver/apache/:建議將apache服務(wù)安裝在另外一個(gè)驅(qū)動(dòng)設(shè)備上的目的在于硬盤往往是一個(gè)系統(tǒng)使用壽命最低的設(shè)備,因此:將服務(wù)數(shù)據(jù)和系統(tǒng)完全分開,不僅能提高了數(shù)據(jù)的訪問速度,更重要的,大大方便系統(tǒng)升級(jí),應(yīng)用備份和恢復(fù)過程。
--shared-module=max:使用動(dòng)態(tài)加載方式載入子模塊會(huì)帶來5%的性能下降,但和帶來的配置方便相比更本不算什么:比如模塊升級(jí)方便,系統(tǒng)升級(jí)風(fēng)險(xiǎn)降低,安裝過程標(biāo)準(zhǔn)化等
--enable-module=most:用most可以將一些不常用的module編譯進(jìn)來,比如后面講到的mod_expire是就不在 apache的缺省常用模塊中
如果不想build so, 也可以這樣:
./configure \
"--with-layout=Apache" \
"--prefix=/path/to/apache" \
"--disable-module=access" \
"--disable-module=actions" \
"--disable-module=autoindex" \
"--disable-module=env" \
"--disable-module=imap" \
"--disable-module=negotiation" \
"--disable-module=setenvif" \
"--disable-module=status" \
"--disable-module=userdir" \
"--disable-module=cgi" \
"--disable-module=include" \
"--disable-module=auth" \
"--disable-module=asis"
但結(jié)果會(huì)發(fā)現(xiàn),這樣編譯對(duì)服務(wù)性能只能有微小的提高(5%左右),但卻失去了以后系統(tǒng)升級(jí)和模塊升級(jí)的靈活性,無(wú)論是模塊還是Apache本身升級(jí)都必須把Apache和PHP的SOURCE加在一起重新編譯。
apache的缺省配置文件一般比較大:可以使用去掉注釋的方法精簡(jiǎn)一下:然后再進(jìn)入具體的培植過程能讓你更快的定制出你所需要的。
grep -v "#" httpd.conf.default >httpd.conf
需要修改的通用項(xiàng)目有以下幾個(gè):
#服務(wù)端口,缺省是8080,建議將整個(gè)Apache配置調(diào)整好后再將服務(wù)端口改到正式服務(wù)的端口
Port 8080 => 80
#服務(wù)器名:缺省沒有
ServerName name.example.com
#最大服務(wù)進(jìn)程數(shù):根據(jù)服務(wù)容量預(yù)測(cè)設(shè)置
MaxClients 256 => 800
#缺省啟動(dòng)服務(wù)后的服務(wù)進(jìn)程數(shù):等服務(wù)比較平穩(wěn)后,按平均負(fù)載下的httpd個(gè)數(shù)設(shè)置就可以
StartServers 5 => 200
不要修改:
以前有建議說修改:
MinSpareServers 5 => 100
MaxSpareServers 10 => 200
但從我的經(jīng)驗(yàn)看來:缺省值已經(jīng)是非常優(yōu)化的了,而且讓Apache自己調(diào)整子共享進(jìn)程個(gè)數(shù)還是比較好的。
特別修改:
在solaris或一些比較容易出現(xiàn)內(nèi)存泄露的應(yīng)用上:
MaxRequestsPerChild 0 =>3000
應(yīng)用模塊和工具的安裝配置:
由于使用模塊動(dòng)態(tài)加載的模式,所以可以方便的通過簡(jiǎn)單的配置調(diào)整來把Apache定制成你需要的:最好把不常用模塊全部清除(無(wú)論處于安全還是效率)。
比如:對(duì)于靜態(tài)頁(yè)面服務(wù)器:就什么其他子模塊都不加載,對(duì)于PHP應(yīng)用就加上PHP模塊,對(duì)于JAVA應(yīng)用就把Resin模塊加載上。而且各種模塊的插拔非常簡(jiǎn)單,這樣調(diào)試過程中就可以簡(jiǎn)單的通過注釋掉不需要的模塊,而不用重新編譯。
一般說來,可以不需要的模塊包括:
#LoadModule env_module libexec/mod_env.so
#LoadModule negotiation_module libexec/mod_negotiation.so
#LoadModule status_module libexec/mod_status.so
#server side include已經(jīng)過時(shí)了
#LoadModule includes_module libexec/mod_include.so
#不需要將沒有缺省index文件的目錄下所有文件列出
#LoadModule autoindex_module libexec/mod_autoindex.so
#盡量不使用CGI:一直是Apache安全問題最多的地方
#LoadModule cgi_module libexec/mod_cgi.so
#LoadModule asis_module libexec/mod_asis.so
#LoadModule imap_module libexec/mod_imap.so
#LoadModule action_module libexec/mod_actions.so
#不使用安全認(rèn)證可以大大提高訪問速度
#LoadModule access_module libexec/mod_access.so
#LoadModule auth_module libexec/mod_auth.so
#LoadModule setenvif_module libexec/mod_setenvif.so
最好保留的有:
#用于定制log格式
LoadModule config_log_module libexec/mod_log_config.so
#用于增加文件應(yīng)用的關(guān)聯(lián)
LoadModule mime_module libexec/mod_mime.so
#用于缺省index文件:index.php等
LoadModule dir_module libexec/mod_dir.so
可用可不用的有:
#比如:需要在~/username/下調(diào)試php可以將
LoadModule userdir_module libexec/mod_userdir.so
#比如:需要將以前的URL進(jìn)行轉(zhuǎn)向或者需要使用CGI script-alias
LoadModule alias_module libexec/mod_alias.so
常用的模塊:
最常用的可能就是php和JAVA應(yīng)用服務(wù)器的前端,此外,從性能上講利用mod_gzip可以減少40%左右的流量,減少機(jī)器用于傳輸?shù)呢?fù)載,而 mod_expires可以減少10%左右的重復(fù)請(qǐng)求,讓重復(fù)的用戶對(duì)指定的頁(yè)面請(qǐng)求結(jié)果都CACHE在本地,根本不向服務(wù)器發(fā)出請(qǐng)求。
建議將所有MODULE的配置都放到相應(yīng)模塊的配置內(nèi)部:<IfModule some_module.c>some_module config </IfModule>
PHP的安裝:
/path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs --with-other-modules-you-need
需要修改的配置:
AddType application/x-httpd-php .php .php3 .any_file_in_php
resin的安裝設(shè)置:
/path/to/resin/src/configure --with-apxs=/path/to/apache/bin/apxs
具體的resin設(shè)置放在另外一個(gè)文件中:比如/home/resin/conf/resin.conf
<IfModule mod_caucho.c>
CauchoConfigFile /path/to/apache/conf/resin.conf
</IfModule>
mod_expires的安裝配置:
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/gif "access plus 1 month"
ExpiresByType text/css "now plus 1 month"
ExpiresDefault "now plus 1 day"
</IfModule>
注釋:
所有的.gif文件1個(gè)月以后過期
所有的文件缺省1天以后過期
mod_gzip的安裝
http://www.chedong.com/tech/compress.html
日志的輪循:cronolog的安裝和設(shè)置
cronolog可以非常整齊的將日志按天輪循存儲(chǔ)
缺省編譯安裝到/usr/local/bin/下,只需要將配置改成:
CustomLog "|/usr/local/sbin/cronolog /home/apache/logs/%w/access_log" combined
日志將按天截?cái)嗖⒋娣旁谝孕瞧跒槟夸浢哪夸浵拢罕热纾簂og/1是周一,log/5是周五, log/0是周日
用gzip壓縮每天的日志:
30 4 * * * /usr/bin/gzip -f /home/apache/logs/`date -d yesterday +%w`/access_log
日志的定期刪除:
30 5 * * */usr/bin/find /home/apache/logs/ -name access_log.gz -mtime +3 |xargs -r /bin/rm -f
升級(jí)維護(hù):
由于使用動(dòng)態(tài)模塊加載方式(DSO模式)安裝Apache,Apache的HTTPD核心服務(wù)和應(yīng)用模塊以及應(yīng)用模塊之間都變的非常靈活,建議將所有獨(dú)立模塊的配置都放在
<IfModule mod_name>
CONFIGURATIONS..
</IfModule>
里,這樣配置非常容易通過屏蔽某個(gè)模塊來進(jìn)行功能調(diào)整:比如:
#AddModule mod_gzip.c
就屏蔽了mod_gzip,而其他模塊不首任何影響。
安裝和維護(hù)過程:
系統(tǒng)安裝:系統(tǒng)管理員的職責(zé)就是安裝系統(tǒng)和一個(gè)按照DSO模式安裝的Apache,然后COLON。
應(yīng)用安裝:由應(yīng)用管理員負(fù)責(zé)具體應(yīng)用所需要的模塊并設(shè)置HTTPD。
系統(tǒng)升級(jí):系統(tǒng)管理員:升級(jí)系統(tǒng)/升級(jí)Apache
應(yīng)用升級(jí):應(yīng)用管理員:升級(jí)應(yīng)用模塊:PHP CAUCHO等
系統(tǒng)備份/恢復(fù):如果Apache不在缺省的系統(tǒng)盤上,只需要將Apache目錄備份就可以了,遇到系統(tǒng)分區(qū)的硬件問題直接使用預(yù)先準(zhǔn)備好的系統(tǒng)COLON,再直接將Apache所在物理盤恢復(fù)就行了。
系統(tǒng)管理員:Apache的最簡(jiǎn)化安裝 OS + Apache (httpd core only)
應(yīng)用管理員:應(yīng)用模塊定制 純靜態(tài)頁(yè)面服務(wù)
core
PHP動(dòng)態(tài)頁(yè)面
core+so
+php
JAVA應(yīng)用
core+so
+caucho
+ssl
應(yīng)用例子: www.example.com
image.example.com
bbs.example.com mall.example.com
例子:Apache和PHP模塊的獨(dú)立升級(jí)。
如果Apache是按照以下方式安裝:
./configure --prefix=/home/apache --enable-shared=max --enable-module=most
PHP是按照以下方式安裝:
./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql
以后單獨(dú)升級(jí)Apache的時(shí)候,仍然是:
./configure --prefix=/home/apache --enable-shared=max --enable-module=most
make
su
#/home/apache/bin/apachectl stop
#make install
單獨(dú)升級(jí)php時(shí),仍然是:
./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql
make
su
#/home/apache/bin/apachectl stop
#make install
#/home/apache/bin/apachectl start
基于反相代理的WEB加速:
squid和mod_proxy都可以實(shí)現(xiàn)反相代理加速。而基于緩存的代理加速比起原有WEB服務(wù),速度會(huì)有數(shù)量級(jí)的提升。
小提示:
Apache安裝后,缺省根目錄下沒有但很有用的2個(gè)文件:
favicon.ico: favicon.ico是一個(gè)16x16的站點(diǎn)圖標(biāo)文件,如果瀏覽器發(fā)現(xiàn)有這個(gè)文件,在地址欄中會(huì)用這個(gè)圖標(biāo)替換調(diào)瀏覽器的網(wǎng)頁(yè)圖標(biāo)。IE6和 MOZILLA等主流瀏覽器都支持這個(gè)功能。
例如: http://www.chedong.com/favicon.ico
robots.txt: 用于告訴搜索引擎的爬蟲程序(spider)網(wǎng)站那些頁(yè)面可以被索引,那些不可以。
具體說明請(qǐng)參考:http://www.robotstxt.org/wc/robots.html
參考文檔:
Apache項(xiàng)目
http://httpd.apache.org
PHP
http://www.php.net
Resin
http://www.caucho.com
mod_gzip
http://sourceforge.net/projects/mod-gzip/
Cronolog
http://www.cronolog.org
mod_expires
http://httpd.apache.org/docs/mod/mod_expires.html
面向搜索引擎的CMS設(shè)計(jì):
http://www.chedong.com/tech/cms.html
http://www.chedong.com/tech/apache_install.html
關(guān)鍵詞: apache install php resin mod_gzip mod_expire webalizer cronolog
內(nèi)容摘要:
Apache是一個(gè)歷史悠久并且功能十分強(qiáng)大的WEB服務(wù)器,但其豐富的功能對(duì)于一個(gè)新手來說往往不知道從何下手。我個(gè)人感覺Apache的設(shè)計(jì)充分體現(xiàn)了模塊化設(shè)計(jì)的優(yōu)勢(shì),通過在動(dòng)態(tài)模塊加載(DSO)模式下的安裝,任何子應(yīng)用模塊都可以通過配置文件的簡(jiǎn)單修改進(jìn)行積木式的靈活配置。安裝的過程可以從簡(jiǎn)單的靜態(tài)html服務(wù)開始,一個(gè)模塊一個(gè)模塊的學(xué)習(xí)使用。從單純的HTML靜態(tài)服務(wù)(core),到復(fù)雜的動(dòng)態(tài)頁(yè)面服務(wù)(core + php, core + resin, core + php + mod_gzip, core + resin + mod_expire)。
本文主要從簡(jiǎn)化安裝==>性能調(diào)優(yōu)==>維護(hù)方便的角度,介紹了WEB服務(wù)的規(guī)劃、HTTPD安裝/應(yīng)用模塊配置、升級(jí)/維護(hù)等過程。讓Apache和PHP,Resin等應(yīng)用模塊的獨(dú)立升級(jí),完全互不影響。
WEB應(yīng)用容量規(guī)劃:根據(jù)硬件配置和WEB應(yīng)用的特點(diǎn)進(jìn)行WEB服務(wù)的規(guī)劃及一些簡(jiǎn)單的估算公式;
Apache安裝過程:apache的通用的簡(jiǎn)化安裝選項(xiàng),方便以后的應(yīng)用的模塊化配置;
修改 HARD_SERVER_LIMIT:
vi /path/to/apache_src/src/include/httpd.h
#define HARD_SERVER_LIMIT 2560 <===將原來的 HARD_SERVER_LIMIT 256 后面加個(gè)“0”
apache編譯:
./configure --prefix=/home/apache --enable-shared=max --enable-module=most
可選應(yīng)用模塊/工具的安裝:php resin mod_gzip mod_expire及各個(gè)模塊之間的配合;
mod_php安裝:./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql
mod_resin安裝:./configure --with-apxs=/home/apache/bin/apxs
mod_gzip安裝:修改Makefile中的 apxs路徑:然后make make install
工具:日志輪循工具cronolog安裝:http://www.cronolog.org
升級(jí)/維護(hù):看看通用和模塊化的安裝過程如何簡(jiǎn)化了日常的升級(jí)/維護(hù)工作;
按照以上的方法:系統(tǒng)管理員和應(yīng)用管理員的職責(zé)可以清楚的分開,互相獨(dú)立。
系統(tǒng)安裝:系統(tǒng)管理員的職責(zé)就是安裝好一臺(tái)DSO模式的Apache,然后COLON即可,
應(yīng)用安裝:由應(yīng)用管理員負(fù)責(zé)具體應(yīng)用所需要的模塊,比如PHP Resin等,并設(shè)置httpd.conf中相關(guān)的配置。
系統(tǒng)升級(jí):系統(tǒng)管理員:升級(jí)操作系統(tǒng)/升級(jí)Apache
應(yīng)用升級(jí):應(yīng)用管理員:升級(jí)應(yīng)用模塊,PHP Resin等。
WEB應(yīng)用的容量規(guī)劃
Apache主要是一個(gè)內(nèi)存消耗型的服務(wù)應(yīng)用,我個(gè)人總結(jié)的經(jīng)驗(yàn)公式:
apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5
為什么會(huì)有一個(gè)apache_max_process_with_good_perfermance和apache_max_process呢?原因是在低負(fù)載下系統(tǒng)可以使用更多的內(nèi)存用于文件系統(tǒng)的緩存,從而進(jìn)一步提高單個(gè)請(qǐng)求的響應(yīng)速度。在高負(fù)載下,系統(tǒng)的單個(gè)請(qǐng)求響應(yīng)速度會(huì)慢不少,而超過 apache_max_process,系統(tǒng)會(huì)因?yàn)殚_始使用硬盤做虛擬內(nèi)存交換空間而導(dǎo)致系統(tǒng)效率急劇下降。此外,同樣的服務(wù):2G內(nèi)存的機(jī)器的 apache_max_process一般只設(shè)置到1G內(nèi)存的1.7倍,因?yàn)锳pache本身會(huì)因?yàn)檫M(jìn)程過多導(dǎo)致性能下降。
例子1:
一個(gè)apache + mod_php的服務(wù)器:一個(gè)apache進(jìn)程一般需要4M內(nèi)存
因此在一個(gè)1G內(nèi)存的機(jī)器上:apache_max_process_with_good_perfermance < (1g / 4m) * 2 = 500
apache_max_process = 500 * 1.5 = 750
所以規(guī)劃你的應(yīng)用讓服務(wù)盡量跑在500個(gè)進(jìn)程以下以保持比較高的效率,并設(shè)置Apache的軟上限在800個(gè)。
例子2:
一個(gè)apache + mod_resin的服務(wù)器: 一個(gè)apache進(jìn)程一般需要2M內(nèi)存
在一個(gè)2G內(nèi)存的機(jī)器上:
apache_max_process_with_good_perfermance < (2g / 2m ) * 2 = 2000
apache_max_process = 2000 * 1.5 = 3000
以上估算都是按小文件服務(wù)估算的(一個(gè)請(qǐng)求一般大小在20k以下)。對(duì)于文件下載類型站點(diǎn),可能還會(huì)受其他因素:比如帶寬等的影響。
Apache安裝過程
服務(wù)器個(gè)數(shù)的硬上限HARD_SERVER_LIMIT的修改:
在Apache的源代碼中缺省的最大進(jìn)程數(shù)是256個(gè),需要修改apache_1.3.xx/src/include/httpd.h
#ifndef HARD_SERVER_LIMIT
#ifdef WIN32
#define HARD_SERVER_LIMIT 1024
#elif defined(NETWARE)
#define HARD_SERVER_LIMIT 2048
#else
#define HARD_SERVER_LIMIT 2560 <===將原來的HARD_SERVER_LIMIT 256 后面加個(gè)“0”
#endif
#endif
解釋:
Apache缺省的最大用戶數(shù)是256個(gè):這個(gè)配置對(duì)于服務(wù)器內(nèi)存還是256M左右的時(shí)代是一個(gè)非常好的缺省設(shè)置,但隨著內(nèi)存成本的急劇下降,現(xiàn)在大型站點(diǎn)的服務(wù)器內(nèi)存配置一般比當(dāng)時(shí)要高一個(gè)數(shù)量級(jí)不止。所以256個(gè)進(jìn)程的硬限制對(duì)于一臺(tái)1G內(nèi)存的機(jī)器來說是太浪費(fèi)了,而且Apache的軟上限 max_client是受限于HARD_SERVER_LIMIT的,因此如果WEB服務(wù)器內(nèi)存大于256M,都應(yīng)該調(diào)高Apache的 HARD_SERVER_LIMIT。根據(jù)個(gè)人的經(jīng)驗(yàn):2560已經(jīng)可以滿足大部分小于2G內(nèi)存的服務(wù)器的容量規(guī)劃了(Apache的軟上限的規(guī)劃請(qǐng)看后面)。
Apache的編譯:以下通用的編譯選項(xiàng)能滿足以后任意模塊的安裝
./configure --prefix=/another_driver/apache/ --enable-shared=max --enable-module=most
比如:
./configure --prefix=/home/apache/ --enable-shared=max --enable-module=most
解釋:
--prefix=/another_driver/apache/:建議將apache服務(wù)安裝在另外一個(gè)驅(qū)動(dòng)設(shè)備上的目的在于硬盤往往是一個(gè)系統(tǒng)使用壽命最低的設(shè)備,因此:將服務(wù)數(shù)據(jù)和系統(tǒng)完全分開,不僅能提高了數(shù)據(jù)的訪問速度,更重要的,大大方便系統(tǒng)升級(jí),應(yīng)用備份和恢復(fù)過程。
--shared-module=max:使用動(dòng)態(tài)加載方式載入子模塊會(huì)帶來5%的性能下降,但和帶來的配置方便相比更本不算什么:比如模塊升級(jí)方便,系統(tǒng)升級(jí)風(fēng)險(xiǎn)降低,安裝過程標(biāo)準(zhǔn)化等
--enable-module=most:用most可以將一些不常用的module編譯進(jìn)來,比如后面講到的mod_expire是就不在 apache的缺省常用模塊中
如果不想build so, 也可以這樣:
./configure \
"--with-layout=Apache" \
"--prefix=/path/to/apache" \
"--disable-module=access" \
"--disable-module=actions" \
"--disable-module=autoindex" \
"--disable-module=env" \
"--disable-module=imap" \
"--disable-module=negotiation" \
"--disable-module=setenvif" \
"--disable-module=status" \
"--disable-module=userdir" \
"--disable-module=cgi" \
"--disable-module=include" \
"--disable-module=auth" \
"--disable-module=asis"
但結(jié)果會(huì)發(fā)現(xiàn),這樣編譯對(duì)服務(wù)性能只能有微小的提高(5%左右),但卻失去了以后系統(tǒng)升級(jí)和模塊升級(jí)的靈活性,無(wú)論是模塊還是Apache本身升級(jí)都必須把Apache和PHP的SOURCE加在一起重新編譯。
apache的缺省配置文件一般比較大:可以使用去掉注釋的方法精簡(jiǎn)一下:然后再進(jìn)入具體的培植過程能讓你更快的定制出你所需要的。
grep -v "#" httpd.conf.default >httpd.conf
需要修改的通用項(xiàng)目有以下幾個(gè):
#服務(wù)端口,缺省是8080,建議將整個(gè)Apache配置調(diào)整好后再將服務(wù)端口改到正式服務(wù)的端口
Port 8080 => 80
#服務(wù)器名:缺省沒有
ServerName name.example.com
#最大服務(wù)進(jìn)程數(shù):根據(jù)服務(wù)容量預(yù)測(cè)設(shè)置
MaxClients 256 => 800
#缺省啟動(dòng)服務(wù)后的服務(wù)進(jìn)程數(shù):等服務(wù)比較平穩(wěn)后,按平均負(fù)載下的httpd個(gè)數(shù)設(shè)置就可以
StartServers 5 => 200
不要修改:
以前有建議說修改:
MinSpareServers 5 => 100
MaxSpareServers 10 => 200
但從我的經(jīng)驗(yàn)看來:缺省值已經(jīng)是非常優(yōu)化的了,而且讓Apache自己調(diào)整子共享進(jìn)程個(gè)數(shù)還是比較好的。
特別修改:
在solaris或一些比較容易出現(xiàn)內(nèi)存泄露的應(yīng)用上:
MaxRequestsPerChild 0 =>3000
應(yīng)用模塊和工具的安裝配置:
由于使用模塊動(dòng)態(tài)加載的模式,所以可以方便的通過簡(jiǎn)單的配置調(diào)整來把Apache定制成你需要的:最好把不常用模塊全部清除(無(wú)論處于安全還是效率)。
比如:對(duì)于靜態(tài)頁(yè)面服務(wù)器:就什么其他子模塊都不加載,對(duì)于PHP應(yīng)用就加上PHP模塊,對(duì)于JAVA應(yīng)用就把Resin模塊加載上。而且各種模塊的插拔非常簡(jiǎn)單,這樣調(diào)試過程中就可以簡(jiǎn)單的通過注釋掉不需要的模塊,而不用重新編譯。
一般說來,可以不需要的模塊包括:
#LoadModule env_module libexec/mod_env.so
#LoadModule negotiation_module libexec/mod_negotiation.so
#LoadModule status_module libexec/mod_status.so
#server side include已經(jīng)過時(shí)了
#LoadModule includes_module libexec/mod_include.so
#不需要將沒有缺省index文件的目錄下所有文件列出
#LoadModule autoindex_module libexec/mod_autoindex.so
#盡量不使用CGI:一直是Apache安全問題最多的地方
#LoadModule cgi_module libexec/mod_cgi.so
#LoadModule asis_module libexec/mod_asis.so
#LoadModule imap_module libexec/mod_imap.so
#LoadModule action_module libexec/mod_actions.so
#不使用安全認(rèn)證可以大大提高訪問速度
#LoadModule access_module libexec/mod_access.so
#LoadModule auth_module libexec/mod_auth.so
#LoadModule setenvif_module libexec/mod_setenvif.so
最好保留的有:
#用于定制log格式
LoadModule config_log_module libexec/mod_log_config.so
#用于增加文件應(yīng)用的關(guān)聯(lián)
LoadModule mime_module libexec/mod_mime.so
#用于缺省index文件:index.php等
LoadModule dir_module libexec/mod_dir.so
可用可不用的有:
#比如:需要在~/username/下調(diào)試php可以將
LoadModule userdir_module libexec/mod_userdir.so
#比如:需要將以前的URL進(jìn)行轉(zhuǎn)向或者需要使用CGI script-alias
LoadModule alias_module libexec/mod_alias.so
常用的模塊:
最常用的可能就是php和JAVA應(yīng)用服務(wù)器的前端,此外,從性能上講利用mod_gzip可以減少40%左右的流量,減少機(jī)器用于傳輸?shù)呢?fù)載,而 mod_expires可以減少10%左右的重復(fù)請(qǐng)求,讓重復(fù)的用戶對(duì)指定的頁(yè)面請(qǐng)求結(jié)果都CACHE在本地,根本不向服務(wù)器發(fā)出請(qǐng)求。
建議將所有MODULE的配置都放到相應(yīng)模塊的配置內(nèi)部:<IfModule some_module.c>some_module config </IfModule>
PHP的安裝:
/path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs --with-other-modules-you-need
需要修改的配置:
AddType application/x-httpd-php .php .php3 .any_file_in_php
resin的安裝設(shè)置:
/path/to/resin/src/configure --with-apxs=/path/to/apache/bin/apxs
具體的resin設(shè)置放在另外一個(gè)文件中:比如/home/resin/conf/resin.conf
<IfModule mod_caucho.c>
CauchoConfigFile /path/to/apache/conf/resin.conf
</IfModule>
mod_expires的安裝配置:
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/gif "access plus 1 month"
ExpiresByType text/css "now plus 1 month"
ExpiresDefault "now plus 1 day"
</IfModule>
注釋:
所有的.gif文件1個(gè)月以后過期
所有的文件缺省1天以后過期
mod_gzip的安裝
http://www.chedong.com/tech/compress.html
日志的輪循:cronolog的安裝和設(shè)置
cronolog可以非常整齊的將日志按天輪循存儲(chǔ)
缺省編譯安裝到/usr/local/bin/下,只需要將配置改成:
CustomLog "|/usr/local/sbin/cronolog /home/apache/logs/%w/access_log" combined
日志將按天截?cái)嗖⒋娣旁谝孕瞧跒槟夸浢哪夸浵拢罕热纾簂og/1是周一,log/5是周五, log/0是周日
用gzip壓縮每天的日志:
30 4 * * * /usr/bin/gzip -f /home/apache/logs/`date -d yesterday +%w`/access_log
日志的定期刪除:
30 5 * * */usr/bin/find /home/apache/logs/ -name access_log.gz -mtime +3 |xargs -r /bin/rm -f
升級(jí)維護(hù):
由于使用動(dòng)態(tài)模塊加載方式(DSO模式)安裝Apache,Apache的HTTPD核心服務(wù)和應(yīng)用模塊以及應(yīng)用模塊之間都變的非常靈活,建議將所有獨(dú)立模塊的配置都放在
<IfModule mod_name>
CONFIGURATIONS..
</IfModule>
里,這樣配置非常容易通過屏蔽某個(gè)模塊來進(jìn)行功能調(diào)整:比如:
#AddModule mod_gzip.c
就屏蔽了mod_gzip,而其他模塊不首任何影響。
安裝和維護(hù)過程:
系統(tǒng)安裝:系統(tǒng)管理員的職責(zé)就是安裝系統(tǒng)和一個(gè)按照DSO模式安裝的Apache,然后COLON。
應(yīng)用安裝:由應(yīng)用管理員負(fù)責(zé)具體應(yīng)用所需要的模塊并設(shè)置HTTPD。
系統(tǒng)升級(jí):系統(tǒng)管理員:升級(jí)系統(tǒng)/升級(jí)Apache
應(yīng)用升級(jí):應(yīng)用管理員:升級(jí)應(yīng)用模塊:PHP CAUCHO等
系統(tǒng)備份/恢復(fù):如果Apache不在缺省的系統(tǒng)盤上,只需要將Apache目錄備份就可以了,遇到系統(tǒng)分區(qū)的硬件問題直接使用預(yù)先準(zhǔn)備好的系統(tǒng)COLON,再直接將Apache所在物理盤恢復(fù)就行了。
系統(tǒng)管理員:Apache的最簡(jiǎn)化安裝 OS + Apache (httpd core only)
應(yīng)用管理員:應(yīng)用模塊定制 純靜態(tài)頁(yè)面服務(wù)
core
PHP動(dòng)態(tài)頁(yè)面
core+so
+php
JAVA應(yīng)用
core+so
+caucho
+ssl
應(yīng)用例子: www.example.com
image.example.com
bbs.example.com mall.example.com
例子:Apache和PHP模塊的獨(dú)立升級(jí)。
如果Apache是按照以下方式安裝:
./configure --prefix=/home/apache --enable-shared=max --enable-module=most
PHP是按照以下方式安裝:
./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql
以后單獨(dú)升級(jí)Apache的時(shí)候,仍然是:
./configure --prefix=/home/apache --enable-shared=max --enable-module=most
make
su
#/home/apache/bin/apachectl stop
#make install
單獨(dú)升級(jí)php時(shí),仍然是:
./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql
make
su
#/home/apache/bin/apachectl stop
#make install
#/home/apache/bin/apachectl start
基于反相代理的WEB加速:
squid和mod_proxy都可以實(shí)現(xiàn)反相代理加速。而基于緩存的代理加速比起原有WEB服務(wù),速度會(huì)有數(shù)量級(jí)的提升。
小提示:
Apache安裝后,缺省根目錄下沒有但很有用的2個(gè)文件:
favicon.ico: favicon.ico是一個(gè)16x16的站點(diǎn)圖標(biāo)文件,如果瀏覽器發(fā)現(xiàn)有這個(gè)文件,在地址欄中會(huì)用這個(gè)圖標(biāo)替換調(diào)瀏覽器的網(wǎng)頁(yè)圖標(biāo)。IE6和 MOZILLA等主流瀏覽器都支持這個(gè)功能。
例如: http://www.chedong.com/favicon.ico
robots.txt: 用于告訴搜索引擎的爬蟲程序(spider)網(wǎng)站那些頁(yè)面可以被索引,那些不可以。
具體說明請(qǐng)參考:http://www.robotstxt.org/wc/robots.html
參考文檔:
Apache項(xiàng)目
http://httpd.apache.org
PHP
http://www.php.net
Resin
http://www.caucho.com
mod_gzip
http://sourceforge.net/projects/mod-gzip/
Cronolog
http://www.cronolog.org
mod_expires
http://httpd.apache.org/docs/mod/mod_expires.html
面向搜索引擎的CMS設(shè)計(jì):
http://www.chedong.com/tech/cms.html
相關(guān)文章
Linux Apache Web 服務(wù)器(續(xù)三)
八、建立Apache站點(diǎn)的基本安全機(jī)制 對(duì)于WWW服務(wù)來說,在WWW服務(wù)器和WWW瀏覽器之間并不始終維持對(duì)話過程。辦要WWW服務(wù)器完成對(duì)一個(gè)URL請(qǐng)求的服務(wù),連接就斷開了2008-03-03
在 本地計(jì)算機(jī) 無(wú)法啟動(dòng)mysql服務(wù) 錯(cuò)誤1067:進(jìn)程意外中止
在 本地計(jì)算機(jī) 無(wú)法啟動(dòng)mysql服務(wù) 錯(cuò)誤1067:進(jìn)程意外中止...2007-05-05
解決IIS的Server Application Error的3種方法
The server has encountered an error while loading an application during the processing of your request. Please refer to the event log for more detail information. Please contact the server administrator for assistance2006-12-12
使用Cacls命令設(shè)置服務(wù)器文件訪問權(quán)限
使用Cacls命令設(shè)置服務(wù)器文件訪問權(quán)限...2007-01-01
提示我aspnet_wp.exe沒有啟動(dòng)的解決方法
提示我aspnet_wp.exe沒有啟動(dòng)的解決方法...2007-05-05

