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