1.什么是Apache ?
Apache,是一種開(kāi)放源碼的HTTP服務(wù)器,可以在大多數(shù)操作系統(tǒng)中運(yùn)行,由于其多平臺(tái)和安全性所以被廣泛使用,是目前最流行的Web服務(wù)器軟件之一。Apache 起初由 Illinois 大學(xué) Urbana-Champaign 的國(guó)家高級(jí)計(jì)算程序中心開(kāi)發(fā),開(kāi)始Apache只是作為Netscape網(wǎng)頁(yè)服務(wù)器之外的選擇。漸漸的,它開(kāi)始在功能和速度上超越其它基于Unix的HTTP服務(wù)器。從1996年4月以來(lái),Apache一直是Internet上最流行的HTTP服務(wù)器: 1999年5月它在 57% 的網(wǎng)頁(yè)服務(wù)器上運(yùn)行;而到了2005年7月這個(gè)比例上升到了69%。Apache名稱(chēng)的由來(lái)是為了紀(jì)念美洲印第安人土著中的一支,因?yàn)檫@支土著擁有最高超的作戰(zhàn)策略和無(wú)窮的耐性。
2.什么是 Apache HTTP Server?
Apache HTTP Server(也被稱(chēng)為Apache httpd)是Apache軟件基金會(huì)創(chuàng)建的一個(gè)健壯的、工業(yè)級(jí)的、功能強(qiáng)大的、開(kāi)放源代碼的HTTP(Web)服務(wù)器。
二、 httpd.conf中常用參數(shù)介紹
1. 連接類(lèi)參數(shù)
l TimeOut
服務(wù)器在斷定請(qǐng)求失敗前等待的時(shí)間,即接收和發(fā)送數(shù)據(jù)的超時(shí)時(shí)間。
【說(shuō)明】
TimeOut參數(shù)用于設(shè)置Apache在等待以下三種事件的時(shí)間:
u 接受一個(gè)GET請(qǐng)求耗費(fèi)的總時(shí)間。
u POST或PUT請(qǐng)求時(shí),接受兩個(gè)TCP包之間的時(shí)間。
u 回應(yīng)時(shí)TCP包傳輸中兩個(gè)ACK包之間的時(shí)間。
還可以理解成Apache允許每次通過(guò)HTTP協(xié)議傳輸數(shù)據(jù)的最大時(shí)間。
l KeppAlive
啟用HTTP持續(xù)作用。
【說(shuō)明】
持續(xù)作用擴(kuò)展自HTTP/1.0和HTTP/1.1的長(zhǎng)連接特性。提供了長(zhǎng)效的HTTP會(huì)話,用以在同一個(gè)TCP連接中進(jìn)行多次請(qǐng)求。在某些情況下,這樣的方式會(huì)對(duì)包含大量圖片的HTML文件起到50%的加速作用。對(duì)于使用HTTP/1.0的客戶(hù)端來(lái)說(shuō),只有客戶(hù)端設(shè)置使用的時(shí)候才會(huì)使用持續(xù)作用連接。而對(duì)于HTTP/1.1的客戶(hù)端來(lái)說(shuō),如果沒(méi)有進(jìn)行特殊指定,長(zhǎng)連接將是默認(rèn)的連接方式。
l MaxKeppAliveRequests
一個(gè)長(zhǎng)連接中允許的請(qǐng)求數(shù)量。
【說(shuō)明】
該參數(shù)限制了當(dāng)啟用KeepAlive時(shí),每次連接允許的請(qǐng)求數(shù)量。如果將此值設(shè)為0,將不限制請(qǐng)求的數(shù)量。這里建議最好將此值設(shè)為一個(gè)比較大的值,以確保最優(yōu)的服務(wù)器性能。
l KeppAliveTimeOut
持續(xù)作用中服務(wù)器在兩次請(qǐng)求之間的等待時(shí)間。
【說(shuō)明】
Apache在關(guān)閉本次連接前等待下一次請(qǐng)求的時(shí)間,即在這段時(shí)間內(nèi)該連接沒(méi)有接收到請(qǐng)求就會(huì)關(guān)閉此連接。一旦收到一個(gè)請(qǐng)求,超時(shí)值將會(huì)被設(shè)置為KeppAliveTimeOut的值。
注意:對(duì)于高負(fù)荷的服務(wù)器來(lái)說(shuō),如果把該參數(shù)的值設(shè)置的較大可能會(huì)導(dǎo)致一些性能方面的問(wèn)題,因?yàn)?/span>KeppAliveTimeOut的值會(huì)影響釋放空閑進(jìn)程、線程時(shí)間的數(shù)量,如果該值大,那么在一定時(shí)間區(qū)間內(nèi)釋放出來(lái)的空閑進(jìn)程、線程的數(shù)量會(huì)少于該值小的,所以會(huì)降低服務(wù)器處理請(qǐng)求的能力,從而影響整個(gè)系統(tǒng)的吞吐量。
l Listen
服務(wù)器監(jiān)聽(tīng)IP地址和端口。
【說(shuō)明】
Listen參數(shù)是指Apache服務(wù)器在指定的IP地址和端口上進(jìn)行監(jiān)聽(tīng);默認(rèn)情況下Apache會(huì)在所有IP地址上監(jiān)聽(tīng)。Listen是一個(gè)必須設(shè)置的指令。如果在配置文件中找不到這個(gè)指令,服務(wù)器將無(wú)法啟動(dòng)。
Listen參數(shù)還可以指定服務(wù)器在哪個(gè)端口或地址和端口的組合上進(jìn)行監(jiān)聽(tīng)請(qǐng)求。如果只指定一個(gè)端口,服務(wù)器將在所有地址上監(jiān)聽(tīng)該端口。如果指定了地址和端口的組合,服務(wù)器將按照指定地址和指定的端口進(jìn)行監(jiān)聽(tīng)。
使用多個(gè)Listen參數(shù)可以指定多個(gè)不同的監(jiān)聽(tīng)端口和/或地址端口組合。
例如,想要服務(wù)器接受80和8080端口上的請(qǐng)求,可以這樣設(shè)置:
Listen 80
Listen 8080
為了讓服務(wù)器在兩個(gè)確定的地址端口組合上接受請(qǐng)求,可以這樣設(shè)置:
Listen 192.64.182.1:80
Listen 192.64.182.5:8080
注意:多個(gè)Listen指令指定了同一個(gè)地址和端口的組合后,會(huì)導(dǎo)致"Address already in use"錯(cuò)誤。
2. 系統(tǒng)路徑管理類(lèi)參數(shù)
l ServerRoot
服務(wù)器的安裝基礎(chǔ)目錄。
【說(shuō)明】
該參數(shù)設(shè)置了服務(wù)器所在的目錄。一般來(lái)說(shuō)它將包含conf/和logs/子目錄。其它配置文件的相對(duì)路徑都基于此目錄 (比如Include或LoadModule)。
例如:
ServerRoot /etc/httpd
l DocumentRoot
組成網(wǎng)絡(luò)上可見(jiàn)的主文檔樹(shù)的根目錄。
【說(shuō)明】
此參數(shù)設(shè)置了httpd服務(wù)的目錄。在沒(méi)有配置類(lèi)似Alias這種參數(shù)的情況下,服務(wù)器會(huì)將請(qǐng)求中的URL附加到DocumentRoot后面以構(gòu)成指向文檔的路徑。比如說(shuō):
DocumentRoot /etc/httpd/www/web
于是對(duì)http://www.ccb.com.cn/index.html的訪問(wèn)就會(huì)指向/etc/httpd/www/web/index.html。如果參數(shù)中不是絕對(duì)路徑,則被假定為是相對(duì)于ServerRoot的路徑。
注意:指定DocumentRoot時(shí)不應(yīng)包括最后的"/"。
l Directory
可以封裝一組參數(shù),使之僅對(duì)文件空間中的某個(gè)目錄及其子目錄生效
【語(yǔ)法】
<Directory directory-path> ... </Directory>
【說(shuō)明】
<Directory>和</Directory>用于封裝一組參數(shù),使其對(duì)某個(gè)目錄及其子目錄生效。directory-path可以是一個(gè)目錄的完整路徑,或是包含了Unix shell匹配語(yǔ)法的通配符字符串,但是通配符都不能匹配"/"字符,例如:<Directory /*/public_html>是無(wú)法匹配/home/user/public_html 的,而<Directory /home/*/public_html>卻能夠正確匹配。
directory-path參數(shù)必須與被訪問(wèn)文件所在文件系統(tǒng)的路徑保持一致。如果有多個(gè)非正則表達(dá)式,<Directory>配置段符合并包含某文檔的目錄(或其父目錄),那么會(huì)以短目錄優(yōu)先的規(guī)則進(jìn)行應(yīng)用。<Directory />的默認(rèn)訪問(wèn)權(quán)限為"Allow from All",這意味著Apache沒(méi)有進(jìn)行訪問(wèn)控制,通過(guò)設(shè)置Order,Deny,Allow,AllowOverride這個(gè)幾個(gè)參數(shù)可以對(duì)訪問(wèn)進(jìn)行控制。
下面簡(jiǎn)單介紹一下這4個(gè)參數(shù)的用法。
1> Allow
該參數(shù)是控制哪些主機(jī)才可以訪問(wèn)目標(biāo)。
示例:
Allow from 192.64.182.53
Allow from 192.64.182.1 192.64.182.3
表示IP地址為192.64.182.1或192.64.182.3或192.64.182.53才可以訪問(wèn)目標(biāo)。
2> Deny
該參數(shù)是控制哪些主機(jī)被禁止訪問(wèn)目標(biāo)。
示例:
Deny from 192.64.182.53
Deny from 192.64.182.1 192.64.182.3
表示IP地址為192.64.182.1或192.64.182.3或192.64.182.53則不能訪問(wèn)目標(biāo)。
3>Order
Order參數(shù)是控制Allow和Deny參數(shù)生效順序的,常用的取值是:Deny,Allow 和Allow,Deny。例如:
Order Deny,Allow
Deny from 192.64.182.53
Allow from 192.64.182.1 192.64.182.3
表示先考慮Deny條件再考慮Allow條件,該配置的意思是拒絕IP地址為192.64.182.53的訪問(wèn),只允許192.64.182.1 和192.64.182.3的訪問(wèn)。
再看一個(gè)例子:
Order Allow,Deny
Allow from all
Deny from 192.64.182.53
表示只拒絕IP地址為192.64.182.53的訪問(wèn)。
4>AllowOverride
當(dāng)服務(wù)器發(fā)現(xiàn)一個(gè).htaccess文件(由AccessFileName指定)時(shí),它需要知道在這個(gè)文件中聲明的哪些指令能覆蓋在此之前指定的配置參數(shù)。一般情況下NONE即可。
【Directory參數(shù)小結(jié)】
最后給出一個(gè)完整封裝目錄的配置段:
<Directory "/home/hrdc/images">
Options Indexes FollowSymLinks //對(duì)URL映射到的系統(tǒng)目錄產(chǎn)生文件列表
AllowOverride None
Order Deny,Allow
Allow from all
</Directory>
上面的配置對(duì)系統(tǒng)中的"/home/hrdc/images"目錄進(jìn)行了封裝,而且對(duì)訪問(wèn)不加任何限制。這段配置后面在講如何將靜態(tài)文件放置到Apache上還會(huì)用到。
3.監(jiān)控反饋類(lèi)參數(shù)
l PidFile
服務(wù)器用于記錄父進(jìn)程(監(jiān)控進(jìn)程)PID的文件
【說(shuō)明】
PidFile指令設(shè)置服務(wù)器用于記錄
父進(jìn)程(監(jiān)控進(jìn)程)PID的文件。如果指定的不是絕對(duì)路徑,那么將視為基于ServerRoot的相對(duì)路徑。
示例:
PidFile /var/run/apache.pid
這個(gè)文件通常用來(lái)給服務(wù)器父進(jìn)程發(fā)送一個(gè)信號(hào),用于關(guān)閉或重啟服務(wù)器,以便重新打開(kāi)ErrorLog和TransferLog文件、重新讀取配置文件。
l ServerAdmin
服務(wù)器返回給客戶(hù)端的錯(cuò)誤信息中所包含的管理員郵件地址。
【說(shuō)明】
該參數(shù)是在所有返回給客戶(hù)端的錯(cuò)誤信息中給出管理員的郵件地址。但也可以是一個(gè)URL地址,如果httpd不能將該參數(shù)的值識(shí)別為URL,它就會(huì)假定它是一個(gè)email-address ,并在超連接中用在mailto后面。這里推薦配置一個(gè)Email地址,如果配置的是URL一定要保證指向一個(gè)受控制的服務(wù)器,否則用戶(hù)將無(wú)法確保和管理員取得聯(lián)系。
示例:
ServerAdmin hradmin.zh@ccb.cn
4.日志管理類(lèi)參數(shù):
l LogLevel
控制錯(cuò)誤日志的級(jí)別
【說(shuō)明】
LogLevel用于設(shè)置服務(wù)器按照日志級(jí)別來(lái)記錄日志信息。該參數(shù)可以選擇的level有:
Level |
描述 |
例子 |
emerg |
緊急(系統(tǒng)無(wú)法使用) |
"Child cannot open lock file. Exiting" |
alert |
必須立即采取措施 |
"getpwuid: couldn't determine user name from uid" |
crit |
致命情況 |
"socket: Failed to get a socket, exiting child" |
error |
錯(cuò)誤情況 |
"Premature end of script headers" |
warn |
警告情況 |
"child process 1234 did not exit, sending another SIGHUP" |
notice |
一般重要情況 |
"httpd: caught SIGBUS, attempting to dump core in ..." |
info |
普通信息 |
"Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..." |
debug |
調(diào)試信息 |
"Opening config file ..." |
注意:當(dāng)指定了某個(gè)級(jí)別后,所有級(jí)別高于它的信息也會(huì)被同時(shí)記錄。建議至少使用crit級(jí)別。當(dāng)錯(cuò)誤日志是一個(gè)單獨(dú)分開(kāi)的正式文件的時(shí)候,notice級(jí)別的消息總是會(huì)被記錄下來(lái),而不能被屏蔽。
l ErrorLog
存放錯(cuò)誤日志的位置
【說(shuō)明】
該參數(shù)指定了當(dāng)服務(wù)器遇到錯(cuò)誤時(shí)記錄日志的文件名。如果該值不是一個(gè)以斜杠(/)開(kāi)頭的絕對(duì)路徑,那么將被認(rèn)為是一個(gè)相對(duì)于ServerRoot的相對(duì)路徑。
示例
ErrorLog /etc/var/log/httpd/error_log
如果配置了一個(gè)以管道符號(hào)(|)開(kāi)頭的值,那么會(huì)為它指定一個(gè)命令來(lái)處理錯(cuò)誤日志。
示例
ErrorLog "|/usr/local/bin/httpd_errors"
注意:當(dāng)在非Unix平臺(tái)上輸入文件路徑的時(shí)候,路徑分隔符必須統(tǒng)一使用正斜線(/)。
l CustomLog
設(shè)置服務(wù)器訪問(wèn)日志的文件名和格式。
【說(shuō)明】
該參數(shù)用來(lái)對(duì)服務(wù)器的請(qǐng)求進(jìn)行日志記錄。第一個(gè)參數(shù)指定了日志文件的位置,第二個(gè)參數(shù)用于設(shè)置日志的格式。
示例:
CustomLog logs/access_log "%h %l %u %t ""%r"" %>s %b"
l 定制日志文件格式
LogFormat和CustomLog的格式化參數(shù)是一個(gè)字符串。這個(gè)字符串會(huì)在每次請(qǐng)求發(fā)生的時(shí)候,被記錄到日志中去。它可以包含將被原樣寫(xiě)入日志文本放入字符串以及C風(fēng)格的控制字符""n"和""t"。文本中的引號(hào)和反斜杠應(yīng)通過(guò)"""來(lái)轉(zhuǎn)義。請(qǐng)求本身的情況也將通過(guò)在格式字符串中放置各種"%"轉(zhuǎn)義符的方法來(lái)記錄,它們?cè)趯?xiě)入日志文件時(shí),根據(jù)下表的定義進(jìn)行轉(zhuǎn)換:
格式字符串 |
描述 |
||||||
%% |
百分號(hào)(Apache2.0.44或更高的版本) |
||||||
%a |
遠(yuǎn)端IP地址 |
||||||
%A |
本機(jī)IP地址 |
||||||
%B |
除HTTP頭以外傳送的字節(jié)數(shù) |
||||||
%b |
以CLF格式顯示的除HTTP頭以外傳送的字節(jié)數(shù),也就是當(dāng)沒(méi)有字節(jié)傳送時(shí)顯示'-'而不是0。 |
||||||
%{Foobar}C |
在請(qǐng)求中傳送給服務(wù)端的cookieFoobar的內(nèi)容。 |
||||||
%D |
服務(wù)器處理本請(qǐng)求所用時(shí)間,以微為單位。 |
||||||
%{FOOBAR}e |
環(huán)境變量FOOBAR的值 |
||||||
%f |
文件名 |
||||||
%h |
遠(yuǎn)端主機(jī) |
||||||
%H |
請(qǐng)求使用的協(xié)議 |
||||||
%{Foobar}i |
發(fā)送到服務(wù)器的請(qǐng)求頭Foobar:的內(nèi)容。 |
||||||
%l |
遠(yuǎn)端登錄名(由identd而來(lái),如果支持的話),除非IdentityCheck設(shè)為"On",否則將得到一個(gè)"-"。 |
||||||
%m |
請(qǐng)求的方法 |
||||||
%{Foobar}n |
來(lái)自另一個(gè)模塊的注解Foobar的內(nèi)容。 |
||||||
%{Foobar}o |
應(yīng)答頭Foobar:的內(nèi)容。 |
||||||
%p |
服務(wù)器服務(wù)于該請(qǐng)求的標(biāo)準(zhǔn)端口。 |
||||||
%P |
為本請(qǐng)求提供服務(wù)的子進(jìn)程的PID。 |
||||||
%{format}P |
服務(wù)于該請(qǐng)求的PID或TID(線程ID),format的取值范圍為:pid和tid(2.0.46及以后版本)以及hextid(需要APR1.2.0及以上版本) |
||||||
%q |
查詢(xún)字符串(若存在則由一個(gè)"?"引導(dǎo),否則返回空串) |
||||||
%r |
請(qǐng)求的第一行 |
||||||
%s |
狀態(tài)。對(duì)于內(nèi)部重定向的請(qǐng)求,這個(gè)狀態(tài)指的是原始請(qǐng)求的狀態(tài),---%>s則指的是最后請(qǐng)求的狀態(tài)。 |
||||||
%t |
時(shí)間,用普通日志時(shí)間格式(標(biāo)準(zhǔn)英語(yǔ)格式) |
||||||
%{format}t |
時(shí)間,用strftime(3)指定的格式表示的時(shí)間。(默認(rèn)情況下按本地化格式) |
||||||
%T |
處理完請(qǐng)求所花時(shí)間,以秒為單位。 |
||||||
%u |
遠(yuǎn)程用戶(hù)名(根據(jù)驗(yàn)證信息而來(lái);如果返回status(%s)為401,可能是假的) |
||||||
%U |
請(qǐng)求的URL路徑,不包含查詢(xún)字符串。 |
||||||
%v |
對(duì)該請(qǐng)求提供服務(wù)的標(biāo)準(zhǔn)ServerName。 |
||||||
%V |
根據(jù)UseCanonicalName指令設(shè)定的服務(wù)器名稱(chēng)。 |
||||||
%X |
請(qǐng)求完成時(shí)的連接狀態(tài):
(在1.3以后的版本中,這個(gè)指令是%c,但這樣就和過(guò)去的SSL語(yǔ)法:%{var}c沖突了) |
||||||
%I |
接收的字節(jié)數(shù),包括請(qǐng)求頭的數(shù)據(jù),并且不能為零。要使用這個(gè)指令你必須啟用mod_logio模塊。 |
||||||
%O |
發(fā)送的字節(jié)數(shù),包括請(qǐng)求頭的數(shù)據(jù),并且不能為零。要使用這個(gè)配置你必須啟用mod_logio模塊。 |
可以緊跟在"%"后面加上一個(gè)逗號(hào)分隔的狀態(tài)碼列表來(lái)限制記錄的條目。例如,"%400,501{User-agent}i"只記錄狀態(tài)碼400和501發(fā)生時(shí)的User-agent頭內(nèi)容;不滿(mǎn)足條件時(shí)用"-"代替。狀態(tài)碼前還可以加上"!"前綴表示否定,"%!200,304,302{Referer}i"記錄所有不同于200,304,302的狀態(tài)碼發(fā)生時(shí)的Referer頭內(nèi)容。"<"和">"修飾符可以用來(lái)指定對(duì)于已被內(nèi)部重定向的請(qǐng)求是選擇原始的請(qǐng)求還是選擇最終的請(qǐng)求。默認(rèn)情況下,%s, %U, %T, %D, %r 使用原始請(qǐng)求,而所有其他格式串則選擇最終請(qǐng)求。例如,%>s 可以用于記錄請(qǐng)求的最終狀態(tài),而 %<u 則記錄一個(gè)已經(jīng)被內(nèi)部重定向到非認(rèn)證資源的請(qǐng)求的原始認(rèn)證用戶(hù)。
出于安全考慮,從2.0.46版本開(kāi)始,%r, %i, %o 中的特殊字符,除了雙引號(hào)(")和反斜線(")分別用 "" 和 "" 進(jìn)行轉(zhuǎn)義、空白字符用C風(fēng)格("n, "t 等)進(jìn)行轉(zhuǎn)義以外,非打印字符和其它特殊字符使用 "xhh 格式進(jìn)行轉(zhuǎn)義(hh是該字符的16進(jìn)制編碼)。在2.0.46以前的版本中,這些內(nèi)容會(huì)被完整的按原樣記錄。這種做法將導(dǎo)致客戶(hù)端可以在日志中插入控制字符,所以在處理這些日志文件的時(shí)候要特別小心。在2.0版本中(不同于1.3),%b 和 %B 格式字符串并不表示發(fā)送到客戶(hù)端的字節(jié)數(shù),而只是簡(jiǎn)單的表示HTTP應(yīng)答字節(jié)數(shù)(在連接中斷或使用SSL時(shí)與前者有所不同)。mod_logio提供的 %O 格式字符串將會(huì)記錄發(fā)送的實(shí)際字節(jié)數(shù)。
一些常見(jiàn)的格式串:
通用日志格式(CLF)
"%h %l %u %t ""%r"" %>s %b"
帶虛擬主機(jī)的通用日志格式
"%v %h %l %u %t ""%r"" %>s %b"
NCSA擴(kuò)展/組合日志格式
"%h %l %u %t ""%r"" %>s %b ""%{Referer}i"" ""%{User-agent}i"""
Referer日志格式
"%{Referer}i -> %U"
Agent(Browser)日志格式
"%{User-agent}i"
URL映射類(lèi)參數(shù)
l Alias
將URL映射到文件系統(tǒng)的特定區(qū)域。
【說(shuō)明】
語(yǔ)法:Alias URL-path file-path|directory-path
Alias參數(shù)使文件可以被存儲(chǔ)在DocumentRoot以外的本地文件系統(tǒng)中。以(%已解碼的)url-path路徑開(kāi)頭的URL可以被映射到以directory-path開(kāi)頭的本地文件中。
示例:
Alias /image /etc/var/www/images
對(duì)"http://www.ccb.com/image/foo.gif"的請(qǐng)求,服務(wù)器將返回"/etc/var/www/images/foo.gif"文件。由于該參數(shù)是匹配完整路徑,所以請(qǐng)求是"http:// www.ccb.com /imagefoo.gif"將不會(huì)被匹配。
注意:如果url-path中有后綴"/",則服務(wù)器要求有后綴"/"以擴(kuò)展此別名。也就是說(shuō)"Alias /icons/ /usr/local/apache/icons/"并不能對(duì)"/icons"實(shí)現(xiàn)別名.
注意,可能需要額外指定一個(gè)<Directory>段來(lái)覆蓋別名的最終對(duì)象。由于只有出現(xiàn)在<Directory>段之前的別名才會(huì)被檢測(cè),所以它只對(duì)最終對(duì)象生效。如果對(duì)在DocumentRoot之外的某個(gè)目錄建立了一個(gè)Alias ,則可能需要明確的對(duì)目標(biāo)目錄設(shè)定訪問(wèn)權(quán)限。
示例:
Alias /image /ftp/pub/image
<Directory /ftp/pub/image>
Order allow,deny
Allow from all
</Directory>
二、多路處理模塊的配置說(shuō)明
Apache HTTP服務(wù)器是一個(gè)強(qiáng)大的、靈活的能夠在多種平臺(tái)、不同環(huán)境下運(yùn)行的Web服務(wù)器。由于不同的平臺(tái)和不同的環(huán)境經(jīng)常產(chǎn)生不同的需求,為了達(dá)到同樣的最佳效果則需要采取不同的實(shí)現(xiàn)方法, Apache的模塊化設(shè)計(jì)就可以很好的適應(yīng)大量不同的環(huán)境。使得網(wǎng)站管理員能夠在編譯和運(yùn)行時(shí)憑借載入不同的模塊來(lái)決定服務(wù)器的附加功能。Apache的多路處理模塊(MPM)就是用于選擇處理網(wǎng)絡(luò)端口綁定、接受請(qǐng)求并指派子進(jìn)程處理來(lái)自客戶(hù)端的請(qǐng)求。
默認(rèn)的MPM
下表列出了不同操作系統(tǒng)上默認(rèn)的MPM。如果編譯時(shí)沒(méi)有進(jìn)行選擇,這將是默認(rèn)選擇的MPM。
操作系統(tǒng)名稱(chēng) |
MPM名稱(chēng) |
BeOS |
|
Netware |
|
OS/2 |
|
Unix |
|
Windows |
1、prefork.c模塊(一個(gè)非線程型的、預(yù)派生的MPM)
prefork.c模塊是由一個(gè)單獨(dú)的控制進(jìn)程(父進(jìn)程)負(fù)責(zé)產(chǎn)生子進(jìn)程,這些子進(jìn)程用于監(jiān)聽(tīng)請(qǐng)求并作出應(yīng)答。Apache設(shè)置了一些備用的(spare)或者是空閑的子進(jìn)程來(lái)處理即將接收的請(qǐng)求,這樣可以避免服務(wù)器接收到請(qǐng)求后在創(chuàng)建子進(jìn)程。在Unix系統(tǒng)中,父進(jìn)程通常以root身份運(yùn)行以便邦定80端口,而 Apache產(chǎn)生的子進(jìn)程通常以一個(gè)低特權(quán)的用戶(hù)運(yùn)行。User和Group參數(shù)就是用于設(shè)置子進(jìn)程的低特權(quán)用戶(hù)。運(yùn)行子進(jìn)程的用戶(hù)必須要對(duì)它所服務(wù)的內(nèi)容有讀取的權(quán)限,但是對(duì)服務(wù)內(nèi)容之外的其他資源最好擁有盡可能少的權(quán)限。
【配置示例】
<IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 400 MaxClients 256 MaxRequestsPerChild 4000 </IfModule> |
【參數(shù)說(shuō)明】
1.ServerLimit
默認(rèn)的MaxClient最大是256個(gè)線程,如果想設(shè)置更大的值,就需要修改ServerLimit這個(gè)參數(shù)。例子中的400是ServerLimit這個(gè)參數(shù)的最大值。如果需要更大,則必須編譯apache,此前都是不需要重新編譯Apache。
2.StartServers
指定服務(wù)器啟動(dòng)時(shí)建立的子進(jìn)程數(shù)量,因?yàn)樽舆M(jìn)程的數(shù)量動(dòng)態(tài)的取決于負(fù)載的輕重,所以一般沒(méi)有必要調(diào)整這個(gè)參數(shù),prefork模式默認(rèn)為5。
3.MinSpareServers
指定空閑子進(jìn)程的最小數(shù)量,所謂空閑子進(jìn)程是指沒(méi)有正在處理請(qǐng)求的子進(jìn)程。默認(rèn)為5。如果當(dāng)前空閑子進(jìn)程數(shù)少于MinSpareServers ,那么Apache將以最大每秒一個(gè)的速度產(chǎn)生新的子進(jìn)程,只有機(jī)器在非常繁忙的情況下才需要調(diào)整這個(gè)參數(shù)。
4.MaxSpareServers
設(shè)置空閑子進(jìn)程的最大數(shù)量。默認(rèn)為10。如果當(dāng)前有超過(guò)MaxSpareServers數(shù)量的空閑子進(jìn)程,那么父進(jìn)程將殺死多余的子進(jìn)程。如果該參數(shù)的值設(shè)置比MinSpareServers小,Apache則會(huì)自動(dòng)將其修改成"MinSpareServers+1"。
5.MaxClients
指可以服務(wù)于客戶(hù)端請(qǐng)求的最大子進(jìn)程數(shù)量,即限定同一時(shí)間客戶(hù)端最大接入請(qǐng)求的數(shù)量,默認(rèn)值為256。任何超過(guò)MaxClients限制的請(qǐng)求都將進(jìn)入等候隊(duì)列,一旦一個(gè)連接被釋放,隊(duì)列中的請(qǐng)求將得到服務(wù)。
6.MaxRequestsPerChild
每個(gè)子進(jìn)程在其生存期內(nèi)允許處理的最大請(qǐng)求數(shù),默認(rèn)為10000.到達(dá)MaxRequestsPerChild的限制后,子進(jìn)程將會(huì)結(jié)束。如果MaxRequestsPerChild為"0",子進(jìn)程將永遠(yuǎn)不會(huì)結(jié)束。這個(gè)參數(shù)也可以理解成控制服務(wù)器殺死舊進(jìn)程產(chǎn)生新進(jìn)程的頻率。
注意:
從系統(tǒng)穩(wěn)定性來(lái)考慮將MaxRequestsPerChild設(shè)置成非零有兩個(gè)好處:
1.可以防止(偶然的)內(nèi)存泄漏無(wú)限進(jìn)行,從而耗盡內(nèi)存。
2.給進(jìn)程一個(gè)有限壽命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時(shí)候減少活動(dòng)進(jìn)程的數(shù)量。
【工作原理介紹】
首先服務(wù)啟動(dòng)后會(huì)創(chuàng)建以StartServers個(gè)數(shù)的進(jìn)程,然后等待來(lái)自客戶(hù)端的請(qǐng)求。我們這里先假設(shè)從客戶(hù)端來(lái)了大量的請(qǐng)求,這時(shí)Apache服務(wù)器會(huì)根據(jù)自身的負(fù)載情況自動(dòng)創(chuàng)建新進(jìn)程,如果服務(wù)器一直沒(méi)有空閑進(jìn)程那么它就會(huì)一直創(chuàng)建新進(jìn)程,直到滿(mǎn)足MaxClients和ServerLimit設(shè)置的最大值。如果來(lái)自客戶(hù)端的負(fù)載沒(méi)有那么大,Apache服務(wù)器將會(huì)根據(jù)MinSpareServers、MaxSpareServers和MaxRequestsPerChild設(shè)置的值來(lái)殺掉多余的進(jìn)程。其中每個(gè)進(jìn)程在某個(gè)確定的時(shí)間只能維持一個(gè)連接。
【小結(jié)】
上面敘述的這些參數(shù)中,對(duì)系統(tǒng)性能影響較大的有兩個(gè):MaxClients 和ServerLimit。這個(gè)兩個(gè)參數(shù)主要影響Web服務(wù)器處理客戶(hù)端請(qǐng)求的能力,它們決定著服務(wù)器創(chuàng)建用來(lái)處理請(qǐng)求的進(jìn)程的最大值。如果來(lái)自客戶(hù)端的請(qǐng)求總數(shù)已經(jīng)達(dá)到系統(tǒng)創(chuàng)建進(jìn)程的最大值(可通過(guò)ps -ef|grep http|wc –l來(lái)確認(rèn)),那么后面來(lái)的請(qǐng)求就要排隊(duì),直到某個(gè)已處理請(qǐng)求完成。這就是應(yīng)用系統(tǒng)資源還很富余而HTTP訪問(wèn)卻很慢的主要原因。如何找出這個(gè)兩個(gè)參數(shù)的最佳值需要綜合很多因素,但一般情況下可以參考系統(tǒng)性能測(cè)試結(jié)果和Web服務(wù)器的系統(tǒng)資源。
注意:prefork模式下創(chuàng)建較多的進(jìn)程將會(huì)占去大量系統(tǒng)內(nèi)存,如果MaxClients和ServerLimit設(shè)置過(guò)大時(shí)可能會(huì)造成Web服務(wù)器崩潰。
2、worker.c模塊(支持混合的多線程多進(jìn)程的多路處理模塊)
worker 模塊使用多個(gè)子進(jìn)程,每個(gè)子進(jìn)程有多個(gè)線程。每個(gè)線程在某個(gè)確定的時(shí)間只能維持一個(gè)連接。通常來(lái)說(shuō),在一個(gè)高流量的HTTP服務(wù)器上,worker 模式是個(gè)比較好的選擇,因?yàn)樗膬?nèi)存使用比prefork要低得多。但worker模式也有不完善的地方,如果一個(gè)線程崩潰,整個(gè)進(jìn)程就會(huì)連同其所有線程一起"死掉"。由于線程共享內(nèi)存空間,所以一個(gè)進(jìn)程在運(yùn)行時(shí)必須被系統(tǒng)識(shí)別為"每個(gè)線程都是安全的"。
【配置示例】
<IfModule worker.c> StartServers 2 MaxClients 400 ServerLimit 12 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 ThreadLimit 75 MaxRequestsPerChild 0 </IfModule> |
【參數(shù)說(shuō)明】
1.ServerLimit
服務(wù)器允許配置的進(jìn)程數(shù)上限。這個(gè)參數(shù)和ThreadLimit結(jié)合使用便決定了MaxClients所能設(shè)置的最大值。任何在重啟期間對(duì)這個(gè)參數(shù)的改變都將被忽略,但對(duì)MaxClients的修改卻會(huì)生效。
2.ThreadLimit
每個(gè)子進(jìn)程可設(shè)置的線程數(shù)上限,這個(gè)參數(shù)決定了每個(gè)子進(jìn)程可創(chuàng)建線程的數(shù),即ThreadsPerChild的上限。任何在重啟期間對(duì)這個(gè)參數(shù)的改變都將被忽略,但對(duì)ThreadsPerChild的修改卻會(huì)生效。默認(rèn)值是"64".
3.StartServers
服務(wù)器啟動(dòng)時(shí)建立的子進(jìn)程數(shù),默認(rèn)值是"3"。
4.MinSpareThreads
最小空閑線程數(shù),默認(rèn)值是75。MPM將基于整個(gè)服務(wù)器監(jiān)視空閑線程數(shù)。如果服務(wù)器中總的空閑線程數(shù)太少,子進(jìn)程將產(chǎn)生新的空閑線程。
5.MaxSpareThreads
設(shè)置最大空閑線程數(shù)。默認(rèn)值是250。MPM將基于整個(gè)服務(wù)器監(jiān)視空閑線程數(shù)。如果服務(wù)器中總的空閑線程數(shù)太多,子進(jìn)程將殺死多余的空閑線程。MaxSpareThreads的取值范圍是有限制的,在Apache的 worker模式下是要求大于等于 MinSpareThreads與ThreadsPerChild之和來(lái)自動(dòng)修正你設(shè)置的值。
6.MaxClients
允許同時(shí)接收客戶(hù)端最大請(qǐng)求的數(shù)量(最大線程數(shù)量)。任何超過(guò)MaxClients限制的請(qǐng)求都將進(jìn)入等候隊(duì)列。默認(rèn)值是400,即16 (ServerLimit)乘以25(ThreadsPerChild)。因此需要增加MaxClients的時(shí)候,你必須同時(shí)增加 ServerLimit的值。
7.ThreadsPerChild
每個(gè)子進(jìn)程建立常駐的執(zhí)行線程數(shù)。默認(rèn)值是25。子進(jìn)程在啟動(dòng)時(shí)建立這些線程后就不再建立新的線程了。
8.MaxRequestsPerChild
設(shè)置每個(gè)子進(jìn)程在其生存期內(nèi)允許提供服務(wù)的最大請(qǐng)求數(shù)量。到達(dá)MaxRequestsPerChild的限制后,子進(jìn)程將會(huì)結(jié)束。如果MaxRequestsPerChild為"0",子進(jìn)程將永遠(yuǎn)不會(huì)結(jié)束。
將MaxRequestsPerChild設(shè)置成非零值有兩個(gè)好處:
1.可以防止(偶然的)內(nèi)存泄漏無(wú)限進(jìn)行,從而耗盡內(nèi)存。
2.給進(jìn)程一個(gè)有限壽命,從而有助于當(dāng)服務(wù)器負(fù)載減輕的時(shí)候減少活動(dòng)進(jìn)程的數(shù)量。
注意
對(duì)于KeepAlive鏈接,只有第一個(gè)請(qǐng)求會(huì)被計(jì)數(shù)。事實(shí)上,它改變了每個(gè)子進(jìn)程限制最大鏈接數(shù)量的行為。
【工作原理介紹】:
worker的工作原理是:先由主控制進(jìn)程創(chuàng)建“StartServers”個(gè)子進(jìn)程,每個(gè)子進(jìn)程中含有“ThreadsPerChild”個(gè)線程,各個(gè)線程獨(dú)立地處理來(lái)自客戶(hù)端的請(qǐng)求。同Prefork一樣,為了不在請(qǐng)求到來(lái)時(shí)在去創(chuàng)建線程,MinSpareThreads和MaxSpareThreads決定了最少和最多空閑線程數(shù);隨著負(fù)載逐漸增大,而現(xiàn)有子進(jìn)程中的線程不能滿(mǎn)足負(fù)載時(shí),主控進(jìn)程將按照“ServerLimit”和“MaxClients”的限制去創(chuàng)建新進(jìn)程,如果“ServerLimit”達(dá)到上限而ServerLimit* ThreadsPerChild <MaxClients時(shí),那么主控進(jìn)程將參考“ThreadLimit”的值去嘗試增加某個(gè)進(jìn)程的線程,前提是ThreadLimit> ThreadsPerChild。如果“ServerLimit”未達(dá)到上限而“MaxClients”達(dá)到上限,那么服務(wù)器將不采取任何行動(dòng)。倘若負(fù)載逐漸減小,那么Apache服務(wù)器將根據(jù)實(shí)際情況去消減線程或進(jìn)程。
【小結(jié)】
在worker模式下MinSpareThreads和MaxSpareThreads的最大缺省值分別是75和250。這兩個(gè)參數(shù)對(duì)Apache的性能影響并不大,可以按照實(shí)際情況做相應(yīng)調(diào)節(jié)。 而ThreadsPerChild參數(shù)是最影響性能的一個(gè),因?yàn)閣orker模式下所能同時(shí)處理的請(qǐng)求總數(shù)是由子進(jìn)程總數(shù)與ThreadsPerChild之積來(lái)決定的。它的最大缺省值是64,如果負(fù)載較大,64也是不夠的。這時(shí)要顯式使用ThreadLimit指令,它的最大缺省值是20000。。注意,不要把這兩個(gè)值設(shè)得太高,如果超過(guò)系統(tǒng)的處理能力,會(huì)使系統(tǒng)很不穩(wěn)定,這個(gè)值最好參考性能測(cè)試的結(jié)果來(lái)設(shè),同時(shí)子進(jìn)程總數(shù)與ThreadsPerChild之積應(yīng)該略大于MaxClinets。
三、配置靜態(tài)文件
目前基于B/S結(jié)構(gòu)的Web頁(yè)面有動(dòng)態(tài)和靜態(tài)兩種形式,其中動(dòng)態(tài)頁(yè)面需由服務(wù)器的解析器進(jìn)行解析,通常還需連接數(shù)據(jù)庫(kù),進(jìn)行數(shù)據(jù)庫(kù)存取操作,最后形成HTML語(yǔ)言信息包反饋給瀏覽者;而靜態(tài)頁(yè)面,則無(wú)須解析,無(wú)須連接數(shù)據(jù)庫(kù),直接反饋給客戶(hù)端就可以。
這里說(shuō)的靜態(tài)文件就是指在服務(wù)器端無(wú)需進(jìn)行任何處理,就可以直接反饋給瀏覽器的文件,例如:HTML、JS,CSS、JPG、BMP等等。
將應(yīng)用系統(tǒng)中的靜態(tài)文件配置到Apache服務(wù)器上有幾大好處,首先從客戶(hù)角度來(lái)看Web頁(yè)面的響應(yīng)時(shí)間提高了,其次從系統(tǒng)資源來(lái)看應(yīng)用服務(wù)器能專(zhuān)心處理動(dòng)態(tài)文件,所以充分發(fā)揮了它的效能,再次從系統(tǒng)穩(wěn)定性來(lái)看Apache服務(wù)器屏蔽了所有靜態(tài)文件的請(qǐng)求,減輕了應(yīng)用服務(wù)器的壓力從而降低了由大訪問(wèn)量帶來(lái)宕機(jī)的風(fēng)險(xiǎn)。
【配置示例1】
Alias /images/ "/home/hrdc/images/" <Directory "/home/hrdc/images"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> #配置圖片請(qǐng)求映射,與CSS,JS的配置類(lèi)似。 <VirtualHost 192.64.108.2:8022> <IfModule mod_weblogic.c> WebLogicCluster 192.64.96.18:8018,192.64.96.11:8011 MatchExpression /file/* MatchExpression *.jsp MatchExpression *.jsf MatchExpression *.rtf MatchExpression *.xls MatchExpression *.doc MatchExpression /console* </IfModule> </VirtualHost> #配置Webloig模塊中的參數(shù)。 |
【關(guān)鍵參數(shù)說(shuō)明】
l VirtualHost
虛擬主機(jī)。
【說(shuō)明】
在這個(gè)參數(shù)內(nèi)可以模仿一個(gè)Web服務(wù)配置眾多參數(shù),即在<VirtualHost>和</VirtualHost>中配置一組僅作用于特定虛擬主機(jī)的參數(shù)。
示例
<VirtualHost 192.64.182.53:8020> |
注意:每個(gè)虛擬主機(jī)必須對(duì)應(yīng)不同的IP地址、端口或是不同的主機(jī)名。
<VirtualHost>中定義的監(jiān)聽(tīng)地址只代表虛擬主機(jī)并不是指定Apache服務(wù)的監(jiān)聽(tīng)地址。指定Apache監(jiān)聽(tīng)地址的參數(shù)則是Listen。
l IfModule
根據(jù)指定的模塊是否啟用為條件來(lái)決定是否進(jìn)行處理。
【語(yǔ)法】
<IfModule [!]module-file|module-identifier> ... </IfModule>
【說(shuō)明】
在該參數(shù)中配置的表達(dá)式為真的時(shí)候才進(jìn)行處理。如果為假,所有其包含的參數(shù)都將被忽略。
<IfModule>段中的表達(dá)式可以為以下兩種方式之一來(lái)表達(dá):
· module
· !module
第一種情況表示,在<IfModule >和</IfModule>之間的配置參數(shù)僅當(dāng)module被載入后才被執(zhí)行。此模塊可以是編譯時(shí)靜態(tài)鏈接的核心模塊或是使用LoadModule指令動(dòng)態(tài)載入的模塊。第二種情況則表示,僅當(dāng)module沒(méi)有載入時(shí)才執(zhí)行參數(shù)內(nèi)的配置處理。
module可以是模塊的標(biāo)識(shí)符或者是編譯模塊時(shí)的文件名。在上面的例子中,mod_weblogic.c就是編譯模塊時(shí)的文件名。
注意:<IfModule>配置段是可以嵌套的,從而可以實(shí)現(xiàn)簡(jiǎn)單的多模塊測(cè)試。
【小結(jié)】
現(xiàn)在再看一下“配置示例1”中關(guān)于Weblogic的配置,其中第一行是用于指定集群中托管服務(wù)器的地址。而下面的“MatchExpression”表示當(dāng)URL匹配上后面的表達(dá)式時(shí),Apache服務(wù)器會(huì)把該請(qǐng)求轉(zhuǎn)給Weblogic處理。從配置中可以看出如果有一個(gè)“http://192.23.108.2:8022/images/logon.jpg”這樣的請(qǐng)求,它是不會(huì)轉(zhuǎn)發(fā)到Weblogic集群上的。