Hi-Fi優質I.T網:PHP?嚙踝蕭嚙?forum_id=51-討論區
您尚未登入...
帳號:
密碼:

忘記密碼 
 
  訂閱電子報

取消   訂閱
 
討論區>>PHP?嚙踝蕭嚙?forum_id=51<<

 
 
發起人:
ruby
一般會員
張貼時間:2009/04/17-15:23:48
   檢舉

 主題:Apache MPM 參數說明

Apache MPM 參數說明











說明收集了被多個多路處理模組(MPM)實現的公共指令
狀態MPM


AcceptMutex指令





















說明Apache用於序列化多個子進程在(多個)網路通訊端(socket)上接受請求的方法
語法AcceptMutex Default|method
預設值AcceptMutex Default
作用域server config
狀態MPM
模組prefork, worker

AcceptMutex指令用於設置序列化多個子進程在(多個)網路通訊端上接受請求的方法。在2.0版本以前,只能在編譯時設定此方法。應當在這裡使用的最佳方法取決於不同的硬體體系結構和作業系統。欲知詳情,請參見性能調節文檔。


如果設置為Default ,那麼將會使用編譯時自動選擇的預設值。其他可用的方法在下麵列出。注意,並不是所有的方法在所有的平臺上都是可用的,如果指定了一個不可用的方法,將會在錯誤日誌中記錄下這個不可用的方法。



flock

這種方法調用系統函數flock(2)來鎖定一個加鎖檔(其位置取決於LockFile指令)。

fcntl

這種方法調用系統函數fcntl(2)來鎖定一個加鎖檔(其位置取決於LockFile指令)。

posixsem

(2.0及更新版本)這種方法使用了POSIX信號燈。如果一個運行中的執行緒佔有了互斥segfault ,則信號燈的所有者將不會被恢復,從而導致伺服器的掛起和失去回應。

pthread

(1.3及更新版本)這種方法使用了POSIX互斥,按理應該可以用於所有完整實現了POSIX執行緒規範的體系中,但是似乎只能用在Solaris2.5及更新版本中,甚至只能在某種配置下才正常運作。如果遇到這種情況,則應該提防伺服器的掛起和失去回應。只提供靜態內容的伺服器可能不受影響。譯者注:此選項不能用於Linux。

sysvsem

(1.3及更新版本)這種方案使用SysV風格的信號燈以實現互斥。不幸的是,SysV風格的信號燈有一些副作用,其一是,Apache有可能不能在結束以前釋放這種信號燈(見ipcs()的man page),另外,這種信號燈API給與網路服務器有相同uid的CGI提供了拒絕服務攻擊的機會(所有CGI,除非用了類似suexeccgiwrapper)。鑒於此,在多數體系中都不用這種方法,除了IRIX(因為加鎖檔的方法在IRIX中代價太高)。

如果你想知道編譯時自動選擇的預設值,你可以將LogLevel設為debug ,這樣預設的AcceptMutex就會記錄到ErrorLog中。



警告


在大多數系統上,使用pthread時,如果一個子進程在持有AcceptCntl互斥信號時異常中止,伺服器將會掛起和失去回應,此時必須手動重啟伺服器才能解決問題。但Solaris是一個例外,因為它提供了一個機制(Apache利用了該機制),允許在一個持有互斥信號的子進程異常中止後恢復互斥信號。


如果你的作業系統實現了pthread_mutexattr_setrobust_np()函數,基本上就能安全的使用pthread選項。譯者注:Solaris實現了此函數,Linux卻沒有實現。


top


CoreDumpDirectory指令





















說明Apache使用的內核轉儲目錄
語法CoreDumpDirectory directory
預設值參見說明
作用域server config
狀態MPM
模組beos, mpm_winnt, prefork, worker

這個指令用於控制Apache使用的內核轉儲目錄。預設位於ServerRoot下,因為這個目錄通常對於運行伺服器的使用者是不可寫的,內核轉儲一般也就不會寫入內容。如果你在調試中需要內核轉儲,你可以用這個指令來指定另外一個目錄。



Linux上的內核轉儲


如果Apache以root身份啟動並切換至其他使用者,即使指定的轉儲目錄對進程是可寫的,Linux內核也將禁止Apache進行內核轉儲。但是Apache2.0.46及以後的版本在你明確指定CoreDumpDirectory的情況下,能夠在Linux2.4以上的版本中強制實現內核轉儲。


top


EnableExceptionHook指令
























說明在子進程崩潰以後啟用一個鉤子來運行例外處理常式
語法EnableExceptionHook On|Off
預設值EnableExceptionHook Off
作用域server config
狀態MPM
模組prefork, worker
相容性僅在 Apache 2.0.49 及以後的版本中可用

因為安全原因,這個指令僅在編譯時使用了 --enable-exception-hook 選項的情況下才可用。它會在一個子進程崩潰以後啟用一個鉤子(hook)來運行一個外部模組以做些後繼處理。


目前有兩個模組(mod_whatkilledusmod_backtrace)可以被鉤子使用。請參見Jeff Trawick的EnableExceptionHook site以獲得更多資訊。


top


GracefulShutdownTimeout指令
























說明指定優雅停止伺服器的超時秒數
語法GracefulShutDownTimeout seconds
預設值GracefulShutDownTimeout 0
作用域server config
狀態MPM
模組prefork, worker, event
相容性僅在 Apache 2.2 及以後的版本中可用

GracefulShutdownTimeout設置伺服器在收到"優雅停止"信號後最多允許使用多少秒來處理尚未完成的連接,超時後伺服器將強行退出。


設為"0"表示永不超時,也就是伺服器必須在處理完所有尚未完成的請求之後才能退出。


top


Group指令
























說明對請求提供服務的Apache子進程運行時的使用者組
語法Group unix-group
預設值Group #<
作用域server config
狀態MPM
模組beos, mpmt_os2, prefork, worker
相容性Apache2.0以後只對全域配置有效

Group指令指定了用於對用戶端請求提供服務的Apache子進程運行時的使用者組。為了使用這個指令,Apache必須以root初始化啟動,否則在切換使用者組時會失敗,並繼續以初始化啟動時的使用者組運行。Unix-group可以是下列之一:



使用者組的名稱

通過名稱引用組。

"#"號後跟一個組編號(GID)

通過編號引用組。


示例


Group www-group


建議你專門為Apache伺服器新建一個使用者組。一些管理員使用nobody使用者,但是這並非總是可用或是合適的。



安全


不要將Group(或User)設置成root ,除非你明確知道自己在做什麼,並且明白其風險所在。


特別提示:在<virtualhost>段中使用該指令已經不再被支援了。你可以使用suexecSuexecUserGroup指令來達到這個目的。



注意


雖然Group指令也存在於beosmpmt_os2MPM中,但是事實上沒用任何用處,只不過是個擺飾罷了。


top


Listen指令





















說明伺服器監聽的IP位址和埠
語法Listen [IP-address:]portnumber[protocol]
作用域server config
狀態MPM
模組beos, mpm_netware, mpm_winnt, mpmt_os2, prefork, worker, event
相容性Apache2.0以後必須設置該指令,protocol參數僅在2.1.5及以後版本中可用

Listen指令指示Apache只在指定的IP位址和埠上監聽;預設情況下Apache會在所有IP位址上監聽。Listen是一個必須設置的指令。如果在設定檔中找不到這個指令,伺服器將無法啟動。這和先前的版本不一樣。


Listen指令指定伺服器在那個埠或位址和埠的組合上監聽接入請求。如果只指定一個埠,伺服器將在所有位址上監聽該埠。如果指定了位址和埠的組合,伺服器將在指定位址的指定埠上監聽。


使用多個Listen指令可以指定多個不同的監聽埠和/或位址埠組合。伺服器將會對列出的所有埠和位址埠組合上的請求作出應答。


例如,想要伺服器接受80和8000埠上的請求,可以這樣設置:



Listen 80
Listen 8000


為了讓伺服器在兩個確定的位址埠組合上接受請求,可以這樣設置:



Listen 192.170.2.1:80
Listen 192.170.2.5:8000


IPv6位址必須像下麵的例子一樣,用方括弧括起來:



Listen [2001:db8::a00:20ff:fea7:ccea]:80


可選的protocol參數在大多數情況下並不需要。若未指定該參數,則將為443埠使用預設的https協定,為其它埠使用http協定。在這裡指定協定是為了確定使用哪個模組來處理請求,以及根據AcceptFilter指令根據不同的協定有針對性的進行優化。


僅在使用非標準埠時才需要指定protocol參數。比如在8443埠運行https協定:



Listen 192.170.2.1:8443 https



錯誤條件

多個Listen指令指定了同一個位址和埠的組合後,會導致"Address already in use"錯誤。

參見



top


ListenBackLog指令





















說明半連結(pending connection)佇列的最大長度
語法ListenBacklog backlog
預設值ListenBacklog 511
作用域server config
狀態MPM
模組beos, mpm_netware, mpm_winnt, mpmt_os2, prefork, worker

半連結(pending connection)佇列的最大長度。一般不需要調整此項參數,然而在一些系統上,必須增大此值以抵禦TCP SYN 洪水攻擊。參見作業系統的listen(2)系統調用的後備參數。


作業系統常常將此值限制為一個較小的數位,具體根據作業系統的不同而不同。需要注意的是,許多作業系統並不是正好使用後備數值,而是取決於設置的值(通常大於後備值)。


top


LockFile指令





















說明接受串列鎖檔的位置
語法LockFile filename
預設值LockFile logs/accept.lock
作用域server config
狀態MPM
模組prefork, worker

LockFile指令設置當AcceptMutex指令的值是fcntlflock的時候,Apache使用的鎖檔的位置。該指令通常保持它的預設值。改變預設值的主要原因是logs目錄位於一個NFS檔案系統上,因為鎖檔必須位於本地磁片上主要伺服器進程的PID會自動添加到檔案名後面。



安全


最好不要將此檔放在任何人都可以具有寫許可權的目錄(比如/var/tmp)中,因為別人可以通過建立一個與伺服器企圖建立的鎖檔同名的檔,來阻止伺服器啟動,從而造成一個拒絕服務攻擊。


參見



top


MaxClients指令





















說明允許同時伺服的最大接入請求數量
語法MaxClients number
預設值參見下麵的說明
作用域server config
狀態MPM
模組beos, prefork, worker

MaxClients指令設置了允許同時伺服的最大接入請求數量。任何超過MaxClients限制的請求都將進入等候佇列,直到達到ListenBacklog指令限制的最大值為止。一旦一個連結被釋放,佇列中的請求將得到服務。


對於非執行緒型的MPM(也就是prefork),MaxClients表示可以用於伺服用戶端請求的最大子進程數量,預設值是256要增大這個值,你必須同時增大ServerLimit


對於執行緒型或者混合型的MPM(也就是beosworker),MaxClients表示可以用於伺服用戶端請求的最大執行緒數量。執行緒型的beos的預設值是50對於混合型的MPM預設值是16(ServerLimit)乘以25(ThreadsPerChild)的結果。因此要將MaxClients增加到超過16個進程才能提供的時候,你必須同時增加ServerLimit的值。


top


MaxMemFree指令





















說明主記憶體分配程式在未調用free()的情況下允許持有的最大自由記憶體數量(KB)
語法MaxMemFree KBytes
預設值MaxMemFree 0
作用域server config
狀態MPM
模組beos, mpm_netware, prefork, worker, mpm_winnt

MaxMemFree指令用於設置主記憶體分配程式在未調用free()的情況下允許持有的最大自由記憶體數量(KB)。若未設置或設置為"0",將表示無限制。


top


MaxRequestsPerChild指令





















說明每個子進程在其生存期內允許伺服的最大請求數量
語法MaxRequestsPerChild number
預設值MaxRequestsPerChild 10000
作用域server config
狀態MPM
模組mpm_netware, mpm_winnt, mpmt_os2, prefork, worker

MaxRequestsPerChild指令設置每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制後,子進程將會結束。如果MaxRequestsPerChild為"0",子進程將永遠不會結束。



不同的預設值


mpm_netwarempm_winnt上的預設值是"0"。


MaxRequestsPerChild設置成非零值有兩個好處:



  • 可以防止(偶然的)記憶體洩漏無限進行,從而耗盡記憶體。

  • 給進程一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動進程的數量。


注意


對於KeepAlive連結,只有第一個請求會被計數。事實上,它改變了每個子進程限制最大連結數量的行為。


top


MaxSpareThreads指令





















說明最大空閒執行緒數
語法MaxSpareThreads number
預設值參見下麵的說明
作用域server config
狀態MPM
模組beos, mpm_netware, mpmt_os2, worker

設置最大空閒執行緒數。不同的MPM對這個指令的處理是不一樣的:


worker的預設值是"250"。這個MPM將基於整個伺服器監視空閒執行緒數。如果伺服器中總的空閒執行緒數太多,子進程將殺死多餘的空閒執行緒。


mpm_netware的預設值是"100"。既然這個MPM只運行單獨一個子進程,此MPM當然亦基於整個伺服器監視空閒執行緒數。


beosmpmt_os2的工作方式與mpm_netware差不多,beos的預設值是"50";mpmt_os2的預設值是"10"。



限制


MaxSpareThreads的取值範圍是有限制的。Apache將按照如下限制自動修正你設置的值:



參見



top


MinSpareThreads指令





















說明最小空閒執行緒數
語法MinSpareThreads number
預設值參見下麵的說明
作用域server config
狀態MPM
模組beos, mpm_netware, mpmt_os2, worker

設置最小空閒執行緒數,用於處理可能到來的突發請求。不同的MPM對這個指令的處理是不一樣的:


worker的預設值是"75"。這個MPM將基於整個伺服器監視空閒執行緒數。如果伺服器中總的空閒執行緒數太少,子進程將產生新的空閒執行緒。


mpm_netware的預設值是"10"。既然這個MPM只運行單獨一個子進程,此MPM當然亦基於整個伺服器監視空閒執行緒數。


beosmpmt_os2的工作方式與mpm_netware差不多,beos的預設值是"1";mpmt_os2的預設值是"5"。


參見



top


PidFile指令





















說明伺服器用於記錄父進程(監控進程)PID的檔
語法PidFile filename
預設值PidFile logs/httpd.pid
作用域server config
狀態MPM
模組beos, mpm_winnt, mpmt_os2, prefork, worker

PidFile指令設置伺服器用於記錄父進程(監控進程)PID的檔。如果指定的不是絕對路徑,那麼將視為基於ServerRoot的相對路徑。



示例


PidFile /var/run/apache.pid


這個檔通常用來便於給伺服器父進程發送一個信號,用於關閉或重啟伺服器,以重新打開ErrorLogTransferLog檔、重新讀取設定檔。這些可以通過發送一個"SIGHUP"(kill <)信號到PidFile記錄的進程PID。


PidFile和其他日誌檔一樣要注意放置位置和安全問題。



注意


從Apache2開始,推薦使用apachectl腳本來啟動或停止伺服器。


top


ReceiveBufferSize指令





















說明TCP接收緩衝區大小(位元組)
語法ReceiveBufferSize bytes
預設值ReceiveBufferSize 0
作用域server config
狀態MPM
模組beos, mpm_netware, mpm_winnt, mpmt_os2, prefork, worker

這個指令設置伺服器的TCP接收緩衝區的大小(位元組)。提高這個值會導致兩個後果:高速度和高潛伏時間(100ms左右)。


如果設置為"0",將使用作業系統預設值。


top


ScoreBoardFile指令





















說明存儲子進程協調資料(coordination data)的檔
語法ScoreBoardFile file-path
預設值ScoreBoardFile logs/apache_status
作用域server config
狀態MPM
模組beos, mpm_winnt, prefork, worker

Apache使用記分板(scoreboard)在父進程和子進程之間進行通信。一些體系結構要求有一個檔來説明通信。如果未指定這個檔,Apache會首先嘗試在匿名共用記憶體中建立完整的記分板(scoreboard),若失敗,將繼續嘗試使用基於檔的共用記憶體在磁片上建立這個檔。若利用這個指令指定這個檔的位置,則Apache將總是在磁片上建立這個檔。



示例


ScoreBoardFile /var/run/apache_status


基於檔的共用記憶體對於使用直接訪問記分板(scoreboard)的協力廠商程式是很有用的。


ScoreBoardFile放置在RAM disk中會對速度提升有很大説明。但是同其他日誌檔一樣也要注意放置位置和安全問題。


參見



top


SendBufferSize指令





















說明TCP發送緩衝區大小(位元組)
語法SendBufferSize bytes
預設值SendBufferSize 0
作用域server config
狀態MPM
模組beos, mpm_netware, mpm_winnt, mpmt_os2, prefork, worker

這個指令設置伺服器的TCP發送緩衝區的大小(位元組)。提高這個值會導致兩個後果:高速度和高潛伏時間(100ms左右)。


如果設置為"0",將使用作業系統預設值。


top


ServerLimit指令





















說明伺服器允許配置的進程數上限
語法ServerLimit number
預設值參見下麵的說明
作用域server config
狀態MPM
模組prefork, worker

對於preforkMPM,這個指令設置了MaxClients最大允許配置的數值。對於workerMPM,這個指令和ThreadLimit結合使用設置了MaxClients最大允許配置的數值。任何在重啟期間對這個指令的改變都將被忽略,但對MaxClients的修改卻會生效。


使用這個指令時要特別當心。如果將ServerLimit設置成一個高出實際需要許多的值,將會有過多的共用記憶體被分配。如果將ServerLimitMaxClients設置成超過系統的處理能力,Apache可能無法啟動,或者系統將變得不穩定。


對於preforkMPM,只有在你需要將MaxClients設置成高於預設值256的時候才需要使用這個指令。要將此指令的值保持和MaxClients一樣。


對於workerMPM,只有在你需要將MaxClientsThreadsPerChild設置成需要超過預設值16個子進程的時候才需要使用這個指令。不要將該指令的值設置的比MaxClients ThreadsPerChild需要的子進程數量高。



注意


Apache在編譯時內部有一個硬限制"ServerLimit 20000"(對於preforkMPM為"ServerLimit 200000")。你不能超越這個限制。


參見



top


StartServers指令





















說明伺服器啟動時建立的子進程數
語法StartServers number
預設值參見下麵的說明
作用域server config
狀態MPM
模組mpmt_os2, prefork, worker

StartServers指令設置了伺服器啟動時建立的子進程數量。因為子進程數量動態的取決於負載的輕重,所有一般沒有必要調整這個參數。


不同的MPM預設值也不一樣。對於worker預設值是"3"。對於prefork預設值是"5",mpmt_os2是"2"。


top


StartThreads指令





















說明伺服器啟動時建立的執行緒數
語法StartThreads number
預設值參見下麵的說明
作用域server config
狀態MPM
模組beos, mpm_netware

設置了伺服器啟動時建立的執行緒數量。因為執行緒數量動態的取決於負載的輕重,所有一般沒有必要調整這個參數。


對於mpm_netware ,預設值是"50",由於只有一個進程,因此所有的執行緒都將用於伺服請求。


對於beos ,預設值是"10",同樣也是所有的執行緒都將用於伺服請求。


top


ThreadLimit指令
























說明每個子進程可配置的執行緒數上限
語法ThreadLimit number
預設值參見下麵的說明
作用域server config
狀態MPM
模組mpm_winnt, worker
相容性僅用於2.0.41及以後版本的mpm_winnt

這個指令設置了每個子進程可配置的執行緒數ThreadsPerChild上限。任何在重啟期間對這個指令的改變都將被忽略,但對ThreadsPerChild的修改卻會生效。


使用這個指令時要特別當心。如果將ThreadLimit設置成一個高出ThreadsPerChild實際需要很多的值,將會有過多的共用記憶體被分配。如果將ThreadLimitThreadsPerChild設置成超過系統的處理能力,Apache可能無法啟動,或者系統將變得不穩定。該指令的值應當和ThreadsPerChild可能達到的最大值保持一致。


對於mpm_winntThreadLimit的預設值是1920;對於其他MPM這個值是64



注意


Apache在編譯時內部有一個硬性的限制"ThreadLimit 20000"(對於mpm_winnt是"ThreadLimit 15000"),你不能超越這個限制。


top


ThreadsPerChild指令





















說明每個子進程建立的執行緒數
語法ThreadsPerChild number
預設值參見下麵的說明
作用域server config
狀態MPM
模組mpm_winnt, worker

這個指令設置了每個子進程建立的執行緒數。子進程在啟動時建立這些執行緒後就不再建立新的執行緒了。如果使用一個類似于mpm_winnt只有一個子進程的MPM,這個數值要足夠大,以便可以處理可能的請求高峰。如果使用一個類似于worker有多個子進程的MPM,每個子進程所擁有的所有執行緒的總數要足夠大,以便可以處理可能的請求高峰。


對於mpm_winntThreadsPerChild的預設值是64;對於其他MPM是25


top


ThreadStackSize指令
























說明處理用戶端連接的執行緒使用的棧尺寸(位元組)
語法ThreadStackSize size
預設值NetWare上為65536;其它平臺上等於作業系統預設值
作用域server config
狀態MPM
模組mpm_netware, mpm_winnt, worker
相容性僅在 Apache 2.1 及以後的版本中可用

ThreadStackSize指令設置了處理用戶端連接(包括調用模組以協助處理)的執行緒允許使用的最大棧尺寸(位元組)。在大多數情況下,作業系統預設的棧尺寸很合理,但是在某些情況下,需要調整這個值:



  • 在預設棧尺寸較小的平臺上(比如HP-UX),Apache可能會在使用一些需要較大棧尺寸的協力廠商模組時崩潰。這樣的問題可以通過將ThreadStackSize設置為一個較大的值來解決。這種調整應當僅僅在協力廠商模組提供者明確要求的情況下才需要,或者是您通過診斷確定是由於棧空間太小而導致崩潰。

  • 在某些平臺上,如果預設的棧空間大於伺服器運行所需空間,那麼將ThreadStackSize值降低到小於作業系統預設值可以讓每個進程中允許生成的最大執行緒數量增加。這種類型的調整應該僅在測試環境中使用,並且對所有伺服器進程進行充分的測試,因為處理某些罕見的請求需要較大的棧空間。一個很小的伺服器配置變化就有可能使得當前的ThreadStackSize設置變得不合適。

top


User指令
























說明實際服務于請求的子進程運行時的使用者
語法User unix-userid
預設值User #<
作用域server config
狀態MPM
模組prefork, worker
相容性2.0版本起僅在全域伺服器配置中可用

User指令用於設置實際提供服務的子進程的使用者。為了使用這個指令,伺服器必須以root身份啟動和初始化。如果你以非root身份啟動伺服器,子進程將不能夠切換至非特權使用者,並繼續以啟動伺服器的原始使用者身份運行。如果確實以root使用者啟動了伺服器,那麼父進程將仍然以root身份運行。Unix-userid是下列值之一:



一個使用者名

通過使用者名引用使用者

"#"號後面跟一個使用者編號

通過使用者編號引用使用者

用於運行子進程的使用者必須是一個沒有特權的使用者,這樣才能保證子進程無權訪問那些不想為外界所知的檔,同樣的,該使用者亦需沒有執行那些不應當被外界執行的程式的許可權。強烈推薦你專門為Apache子進程建立一個單獨的使用者和組。一些管理員使用nobody使用者,但是這並不能總是符合要求,因為可能有其他程式也在使用這個使用者。



安全


不要將User(或Group)設置成root ,除非你明確知道自己在做什麼,並且明白其風險所在。


特別提示:在<virtualhost>段中使用該指令已經不再被支援了。你可以使用suexecSuexecUserGroup指令來達到這個目的。



注意


雖然User指令也存在於beosmpmt_os2MPM中,但是事實上沒用任何用處,只不過是個擺飾罷了。


簽名
By Ruby

 


回  應

1.回應人:
ruby
一般會員
回應時間:2009/09/24-09:41:32
   檢舉


 回應內容:

test

簽名
By Ruby




頁次:1 /1
 

Hi-Fi優質I.T網”站內所有文章、圖片除特別加註外均屬本站所有,如有任何問題請來信告知
請支持言論自由,討論區所發表之言論不代表本站立場
Hi-Fi優質I.T網”版權所有2004©
---最佳顯示效果1024*768---