Apache MPM 參數說明
說明 |
收集了被多個多路處理模組(MPM)實現的公共指令 |
---|
狀態 |
MPM |
---|
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,除非用了類似suexec 或cgiwrapper )。鑒於此,在多數體系中都不用這種方法,除了IRIX(因為加鎖檔的方法在IRIX中代價太高)。
如果你想知道編譯時自動選擇的預設值,你可以將LogLevel 設為debug ,這樣預設的AcceptMutex 就會記錄到ErrorLog 中。 警告在大多數系統上,使用pthread 時,如果一個子進程在持有AcceptCntl 互斥信號時異常中止,伺服器將會掛起和失去回應,此時必須手動重啟伺服器才能解決問題。但Solaris是一個例外,因為它提供了一個機制(Apache利用了該機制),允許在一個持有互斥信號的子進程異常中止後恢復互斥信號。 如果你的作業系統實現了pthread_mutexattr_setrobust_np() 函數,基本上就能安全的使用pthread 選項。譯者注:Solaris實現了此函數,Linux卻沒有實現。

這個指令用於控制Apache使用的內核轉儲目錄。預設位於ServerRoot 下,因為這個目錄通常對於運行伺服器的使用者是不可寫的,內核轉儲一般也就不會寫入內容。如果你在調試中需要內核轉儲,你可以用這個指令來指定另外一個目錄。 Linux上的內核轉儲如果Apache以root身份啟動並切換至其他使用者,即使指定的轉儲目錄對進程是可寫的,Linux內核也將禁止Apache進行內核轉儲。但是Apache2.0.46及以後的版本在你明確指定CoreDumpDirectory 的情況下,能夠在Linux2.4以上的版本中強制實現內核轉儲。
因為安全原因,這個指令僅在編譯時使用了 --enable-exception-hook 選項的情況下才可用。它會在一個子進程崩潰以後啟用一個鉤子(hook)來運行一個外部模組以做些後繼處理。 目前有兩個模組(mod_whatkilledus 和mod_backtrace )可以被鉤子使用。請參見Jeff Trawick的EnableExceptionHook site以獲得更多資訊。
GracefulShutdownTimeout 設置伺服器在收到"優雅停止"信號後最多允許使用多少秒來處理尚未完成的連接,超時後伺服器將強行退出。
設為"0"表示永不超時,也就是伺服器必須在處理完所有尚未完成的請求之後才能退出。
Group 指令指定了用於對用戶端請求提供服務的Apache子進程運行時的使用者組。為了使用這個指令,Apache必須以root 初始化啟動,否則在切換使用者組時會失敗,並繼續以初始化啟動時的使用者組運行。Unix-group可以是下列之一:
- 使用者組的名稱
- 通過名稱引用組。
- "
# "號後跟一個組編號(GID)
- 通過編號引用組。
建議你專門為Apache伺服器新建一個使用者組。一些管理員使用nobody 使用者,但是這並非總是可用或是合適的。 安全不要將Group (或User )設置成root ,除非你明確知道自己在做什麼,並且明白其風險所在。 特別提示:在<virtualhost> 段中使用該指令已經不再被支援了。你可以使用suexec 的SuexecUserGroup 指令來達到這個目的。

Listen 指令指示Apache只在指定的IP位址和埠上監聽;預設情況下Apache會在所有IP位址上監聽。Listen 是一個必須設置的指令。如果在設定檔中找不到這個指令,伺服器將無法啟動。這和先前的版本不一樣。
Listen 指令指定伺服器在那個埠或位址和埠的組合上監聽接入請求。如果只指定一個埠,伺服器將在所有位址上監聽該埠。如果指定了位址和埠的組合,伺服器將在指定位址的指定埠上監聽。
使用多個Listen 指令可以指定多個不同的監聽埠和/或位址埠組合。伺服器將會對列出的所有埠和位址埠組合上的請求作出應答。 例如,想要伺服器接受80和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 "錯誤。 參見

半連結(pending connection)佇列的最大長度。一般不需要調整此項參數,然而在一些系統上,必須增大此值以抵禦TCP SYN 洪水攻擊。參見作業系統的listen(2) 系統調用的後備參數。 作業系統常常將此值限制為一個較小的數位,具體根據作業系統的不同而不同。需要注意的是,許多作業系統並不是正好使用後備數值,而是取決於設置的值(通常大於後備值)。
LockFile 指令設置當AcceptMutex 指令的值是fcntl 或flock 的時候,Apache使用的鎖檔的位置。該指令通常保持它的預設值。改變預設值的主要原因是logs 目錄位於一個NFS檔案系統上,因為鎖檔必須位於本地磁片上。主要伺服器進程的PID會自動添加到檔案名後面。
安全最好不要將此檔放在任何人都可以具有寫許可權的目錄(比如/var/tmp )中,因為別人可以通過建立一個與伺服器企圖建立的鎖檔同名的檔,來阻止伺服器啟動,從而造成一個拒絕服務攻擊。 參見
MaxMemFree 指令用於設置主記憶體分配程式在未調用free() 的情況下允許持有的最大自由記憶體數量(KB)。若未設置或設置為"0",將表示無限制。
MaxRequestsPerChild 指令設置每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild 的限制後,子進程將會結束。如果MaxRequestsPerChild 為"0 ",子進程將永遠不會結束。
將MaxRequestsPerChild 設置成非零值有兩個好處:
- 可以防止(偶然的)記憶體洩漏無限進行,從而耗盡記憶體。
- 給進程一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動進程的數量。
注意對於KeepAlive 連結,只有第一個請求會被計數。事實上,它改變了每個子進程限制最大連結數量的行為。
設置最大空閒執行緒數。不同的MPM對這個指令的處理是不一樣的: worker 的預設值是"250 "。這個MPM將基於整個伺服器監視空閒執行緒數。如果伺服器中總的空閒執行緒數太多,子進程將殺死多餘的空閒執行緒。
mpm_netware 的預設值是"100 "。既然這個MPM只運行單獨一個子進程,此MPM當然亦基於整個伺服器監視空閒執行緒數。
beos 和mpmt_os2 的工作方式與mpm_netware 差不多,beos 的預設值是"50 ";mpmt_os2 的預設值是"10 "。
限制MaxSpareThreads 的取值範圍是有限制的。Apache將按照如下限制自動修正你設置的值:
參見
PidFile 指令設置伺服器用於記錄父進程(監控進程)PID的檔。如果指定的不是絕對路徑,那麼將視為基於ServerRoot 的相對路徑。
示例PidFile /var/run/apache.pid
這個檔通常用來便於給伺服器父進程發送一個信號,用於關閉或重啟伺服器,以重新打開ErrorLog 和TransferLog 檔、重新讀取設定檔。這些可以通過發送一個"SIGHUP"(kill <)信號到PidFile 記錄的進程PID。 PidFile 和其他日誌檔一樣要注意放置位置和安全問題。
這個指令設置伺服器的TCP接收緩衝區的大小(位元組)。提高這個值會導致兩個後果:高速度和高潛伏時間(100ms左右)。 如果設置為"0 ",將使用作業系統預設值。
Apache使用記分板(scoreboard)在父進程和子進程之間進行通信。一些體系結構要求有一個檔來説明通信。如果未指定這個檔,Apache會首先嘗試在匿名共用記憶體中建立完整的記分板(scoreboard),若失敗,將繼續嘗試使用基於檔的共用記憶體在磁片上建立這個檔。若利用這個指令指定這個檔的位置,則Apache將總是在磁片上建立這個檔。 示例ScoreBoardFile /var/run/apache_status
基於檔的共用記憶體對於使用直接訪問記分板(scoreboard)的協力廠商程式是很有用的。 將ScoreBoardFile 放置在RAM disk中會對速度提升有很大説明。但是同其他日誌檔一樣也要注意放置位置和安全問題。 參見
這個指令設置伺服器的TCP發送緩衝區的大小(位元組)。提高這個值會導致兩個後果:高速度和高潛伏時間(100ms左右)。 如果設置為"0 ",將使用作業系統預設值。
StartServers 指令設置了伺服器啟動時建立的子進程數量。因為子進程數量動態的取決於負載的輕重,所有一般沒有必要調整這個參數。
不同的MPM預設值也不一樣。對於worker 預設值是"3 "。對於prefork 預設值是"5 ",mpmt_os2 是"2 "。
設置了伺服器啟動時建立的執行緒數量。因為執行緒數量動態的取決於負載的輕重,所有一般沒有必要調整這個參數。 對於mpm_netware ,預設值是"50 ",由於只有一個進程,因此所有的執行緒都將用於伺服請求。 對於beos ,預設值是"10 ",同樣也是所有的執行緒都將用於伺服請求。
這個指令設置了每個子進程建立的執行緒數。子進程在啟動時建立這些執行緒後就不再建立新的執行緒了。如果使用一個類似于mpm_winnt 只有一個子進程的MPM,這個數值要足夠大,以便可以處理可能的請求高峰。如果使用一個類似于worker 有多個子進程的MPM,每個子進程所擁有的所有執行緒的總數要足夠大,以便可以處理可能的請求高峰。 對於mpm_winnt ,ThreadsPerChild 的預設值是64 ;對於其他MPM是25 。
ThreadStackSize 指令設置了處理用戶端連接(包括調用模組以協助處理)的執行緒允許使用的最大棧尺寸(位元組)。在大多數情況下,作業系統預設的棧尺寸很合理,但是在某些情況下,需要調整這個值:
- 在預設棧尺寸較小的平臺上(比如HP-UX),Apache可能會在使用一些需要較大棧尺寸的協力廠商模組時崩潰。這樣的問題可以通過將
ThreadStackSize 設置為一個較大的值來解決。這種調整應當僅僅在協力廠商模組提供者明確要求的情況下才需要,或者是您通過診斷確定是由於棧空間太小而導致崩潰。
- 在某些平臺上,如果預設的棧空間大於伺服器運行所需空間,那麼將
ThreadStackSize 值降低到小於作業系統預設值可以讓每個進程中允許生成的最大執行緒數量增加。這種類型的調整應該僅在測試環境中使用,並且對所有伺服器進程進行充分的測試,因為處理某些罕見的請求需要較大的棧空間。一個很小的伺服器配置變化就有可能使得當前的ThreadStackSize 設置變得不合適。

User 指令用於設置實際提供服務的子進程的使用者。為了使用這個指令,伺服器必須以root 身份啟動和初始化。如果你以非root 身份啟動伺服器,子進程將不能夠切換至非特權使用者,並繼續以啟動伺服器的原始使用者身份運行。如果確實以root 使用者啟動了伺服器,那麼父進程將仍然以root 身份運行。Unix-userid是下列值之一:
- 一個使用者名
- 通過使用者名引用使用者
- "#"號後面跟一個使用者編號
- 通過使用者編號引用使用者
用於運行子進程的使用者必須是一個沒有特權的使用者,這樣才能保證子進程無權訪問那些不想為外界所知的檔,同樣的,該使用者亦需沒有執行那些不應當被外界執行的程式的許可權。強烈推薦你專門為Apache子進程建立一個單獨的使用者和組。一些管理員使用nobody 使用者,但是這並不能總是符合要求,因為可能有其他程式也在使用這個使用者。 安全不要將User (或Group )設置成root ,除非你明確知道自己在做什麼,並且明白其風險所在。 特別提示:在<virtualhost> 段中使用該指令已經不再被支援了。你可以使用suexec 的SuexecUserGroup 指令來達到這個目的。 |