BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            37 Posts :: 64 Stories :: 21 Comments :: 0 Trackbacks

          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)始在功能和速度上超越其它基于UnixHTTP服務(wù)器。從19964月以來(lái),Apache一直是Internet上最流行的HTTP服務(wù)器: 19995月它在 57% 的網(wǎng)頁(yè)服務(wù)器上運(yùn)行;而到了20057月這個(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ù)

           

          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   POSTPUT請(qǐng)求時(shí),接受兩個(gè)TCP包之間的時(shí)間。

          u   回應(yīng)時(shí)TCP包傳輸中兩個(gè)ACK包之間的時(shí)間。

          還可以理解成Apache允許每次通過(guò)HTTP協(xié)議傳輸數(shù)據(jù)的最大時(shí)間。

          KeppAlive

          啟用HTTP持續(xù)作用。

          【說(shuō)明】

          持續(xù)作用擴(kuò)展自HTTP/1.0HTTP/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)的連接方式。

           

          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ù)器性能。

           

          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)的吞吐量。

           

          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ù)器接受808080端口上的請(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ù)

          ServerRoot

          服務(wù)器的安裝基礎(chǔ)目錄。

          【說(shuō)明】

          該參數(shù)設(shè)置了服務(wù)器所在的目錄。一般來(lái)說(shuō)它將包含conf/logs/子目錄。其它配置文件的相對(duì)路徑都基于此目錄 (比如IncludeLoadModule)

          例如:

          ServerRoot /etc/httpd

           

          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)包括最后的"/"

           

          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è)置OrderDenyAllowAllowOverride這個(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.1192.64.182.3192.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.1192.64.182.3192.64.182.53則不能訪問(wèn)目標(biāo)。

          3>Order

          Order參數(shù)是控制AllowDeny參數(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ù)

          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)ErrorLogTransferLog文件、重新讀取配置文件。

          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ù):

          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),而不能被屏蔽。

          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)一使用正斜線(/)

           

          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"

          定制日志文件格式

          LogFormatCustomLog的格式化參數(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)求的PIDTID(線程ID)format的取值范圍為:pidtid(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):

          X=

          連接在應(yīng)答完成前中斷。

          +=

          應(yīng)答傳送完后繼續(xù)保持連接。

          -=

          應(yīng)答傳送完后關(guān)閉連接。

          (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)碼400501發(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ù)。

          官方的一些說(shuō)明

          出于安全考慮,從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ù)

          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

          beos

          Netware

          mpm_netware

          OS/2

          mpmt_os2

          Unix

          prefork

          Windows

          mpm_winnt

          1prefork.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)行。UserGroup參數(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ù)。例子中的400ServerLimit這個(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)足MaxClientsServerLimit設(shè)置的最大值。如果來(lái)自客戶(hù)端的負(fù)載沒(méi)有那么大,Apache服務(wù)器將會(huì)根據(jù)MinSpareServersMaxSpareServersMaxRequestsPerChild設(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)存,如果MaxClientsServerLimit設(shè)置過(guò)大時(shí)可能會(huì)造成Web服務(wù)器崩潰。

          2worker.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)值是75MPM將基于整個(gè)服務(wù)器監(jiān)視空閑線程數(shù)。如果服務(wù)器中總的空閑線程數(shù)太少,子進(jìn)程將產(chǎn)生新的空閑線程。

          5.MaxSpareThreads
          設(shè)置最大空閑線程數(shù)。默認(rèn)值是250MPM將基于整個(gè)服務(wù)器監(jiān)視空閑線程數(shù)。如果服務(wù)器中總的空閑線程數(shù)太多,子進(jìn)程將殺死多余的空閑線程。MaxSpareThreads的取值范圍是有限制的,在Apache worker模式下是要求大于等于 MinSpareThreadsThreadsPerChild之和來(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)建線程,MinSpareThreadsMaxSpareThreads決定了最少和最多空閑線程數(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)行任何處理,就可以直接反饋給瀏覽器的文件,例如:HTMLJSCSSJPGBMP等等。

          將應(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ō)明】

          VirtualHost

          虛擬主機(jī)。

          【說(shuō)明】

          在這個(gè)參數(shù)內(nèi)可以模仿一個(gè)Web服務(wù)配置眾多參數(shù),即在<VirtualHost></VirtualHost>中配置一組僅作用于特定虛擬主機(jī)的參數(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>

          注意:每個(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

          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集群上的。

          posted on 2009-09-22 10:50 xiachang88 閱讀(3810) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 梁山县| 景德镇市| 宁化县| 丹棱县| 内黄县| 孟连| 忻城县| 陆良县| 盐山县| 邵东县| 合阳县| 秦安县| 南郑县| 古蔺县| 泸定县| 铜梁县| 沈丘县| 涟水县| 定襄县| 全椒县| 崇仁县| 赤峰市| 关岭| 昌乐县| 灌南县| 杂多县| 大丰市| 永胜县| 西丰县| 连平县| 滨海县| 原阳县| 吐鲁番市| 宣恩县| 仁布县| 隆林| 彩票| 铁岭市| 巍山| 景东| 尼木县|