Apache MPM 公共指令
說明 收集了被多個多路處理模塊(MPM)實現的公共指令
狀態 MPM
top
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,除非用了類似suexec或cgiwrapper)。鑑於此,在多數體系中都不用這種方法,除了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_whatkilledus和mod_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 #-1
作用域 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>段中使用該指令已經不再被支持了。你可以使用suexec的SuexecUserGroup指令來達到這個目的。
注意
雖然Group指令也存在於beos和mpmt_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"錯誤。
參見
* DNS問題
* 地址和端口綁定
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指令的值是fcntl或flock的時候,Apache使用的鎖文件的位置。該指令通常保持它的默認值。改變默認值的主要原因是logs目錄位於一個NFS文件系統上,因為鎖文件必須位於本地磁盤上。主服務器進程的PID會自動添加到文件名後面。
安全
最好不要將此文件放在任何人都可以具有寫權限的目錄(比如/var/tmp)中,因為別人可以通過建立一個與服務器企圖建立的鎖文件同名的文件,來阻止服務器啟動,從而造成一個拒絕服務攻擊。
參見
* AcceptMutex
top
MaxClients 指令
說明 允許同時伺服的最大接入請求數量
語法 MaxClients number
默認值 參見下面的說明
作用域 server config
狀態 MPM
模塊 beos, prefork, worker
MaxClients指令設置了允許同時伺服的最大接入請求數量。任何超過MaxClients限制的請求都將進入等候隊列,直到達到ListenBacklog指令限制的最大值為止。一旦一個鏈接被釋放,隊列中的請求將得到服務。
對於非線程型的MPM(也就是prefork),MaxClients表示可以用於伺服客戶端請求的最大子進程數量,默認值是256。要增大這個值,你必須同時增大ServerLimit 。
對於線程型或者混合型的MPM(也就是beos或worker),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_netware和mpm_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當然亦基於整個服務器監視空閒線程數。
beos和mpmt_os2的工作方式與mpm_netware差不多,beos的默認值是"50";mpmt_os2的默認值是"10"。
限制
MaxSpareThreads的取值範圍是有限制的。Apache將按照如下限制自動修正你設置的值:
* mpm_netware要求其小於等於MinSpareThreads
* worker要求其大於等於MinSpareThreads加上ThreadsPerChild的和
參見
* MinSpareThreads
* StartServers
top
MinSpareThreads 指令
說明 最小空閒線程數
語法 MinSpareThreads number
默認值 參見下面的說明
作用域 server config
狀態 MPM
模塊 beos, mpm_netware, mpmt_os2, worker
設置最小空閒線程數,用於處理可能到來的突發請求。不同的MPM對這個指令的處理是不一樣的:
worker的默認值是"75"。這個MPM將基於整個服務器監視空閒線程數。如果服務器中總的空閒線程數太少,子進程將產生新的空閒線程。
mpm_netware的默認值是"10"。既然這個MPM只運行單獨一個子進程,此MPM當然亦基於整個服務器監視空閒線程數。
beos和mpmt_os2的工作方式與mpm_netware差不多,beos的默認值是"1";mpmt_os2的默認值是"5"。
參見
* MaxSpareThreads
* StartServers
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
這個文件通常用來便於給服務器父進程發送一個信號,用於關閉或重啟服務器,以重新打開ErrorLog和TransferLog文件、重新讀取配置文件。這些可以通過發送一個"SIGHUP"(kill -1)信號到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中會對速度提升有很大幫助。但是同其他日誌文件一樣也要注意放置位置和安全問題。
參見
* 停止和重啟Apache
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設置成一個高出實際需要許多的值,將會有過多的共享內存被分配。如果將ServerLimit和MaxClients設置成超過系統的處理能力,Apache可能無法啟動,或者係統將變得不穩定。
對於preforkMPM,只有在你需要將MaxClients設置成高於默認值256的時候才需要使用這個指令。要將此指令的值保持和MaxClients一樣。
對於workerMPM,只有在你需要將MaxClients和ThreadsPerChild設置成需要超過默認值16個子進程的時候才需要使用這個指令。不要將該指令的值設置的比MaxClients 和ThreadsPerChild需要的子進程數量高。
注意
Apache在編譯時內部有一個硬限制"ServerLimit 20000"(對於preforkMPM為"ServerLimit 200000")。你不能超越這個限制。
參見
* 停止和重啟Apache
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實際需要很多的值,將會有過多的共享內存被分配。如果將ThreadLimit和ThreadsPerChild設置成超過系統的處理能力,Apache可能無法啟動,或者係統將變得不穩定。該指令的值應當和ThreadsPerChild可能達到的最大值保持一致。
對於mpm_winnt,ThreadLimit的默認值是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_winnt,ThreadsPerChild的默認值是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 #-1
作用域 server config
狀態 MPM
模塊 prefork, worker
兼容性 2.0版本起僅在全局服務器配置中可用
User指令用於設置實際提供服務的子進程的用戶。為了使用這個指令,服務器必須以root身份啟動和初始化。如果你以非root身份啟動服務器,子進程將不能夠切換至非特權用戶,並繼續以啟動服務器的原始用戶身份運行。如果確實以root用戶啟動了服務器,那麼父進程將仍然以root身份運行。Unix-userid是下列值之一:
一個用戶名
通過用戶名引用用戶
"#"號後面跟一個用戶編號
通過用戶編號引用用戶
用於運行子進程的用戶必須是一個沒有特權的用戶,這樣才能保證子進程無權訪問那些不想為外界所知的文件,同樣的,該用戶亦需沒有執行那些不應當被外界執行的程序的權限。強烈推薦你專門為Apache子進程建立一個單獨的用戶和組。一些管理員使用nobody用戶,但是這並不能總是符合要求,因為可能有其他程序也在使用這個用戶。
安全
不要將User(或Group)設置成root ,除非你明確知道自己在做什麼,並且明白其風險所在。
特別提示:在<VirtualHost>段中使用該指令已經不再被支持了。你可以使用suexec的SuexecUserGroup指令來達到這個目的。
注意
雖然User指令也存在於beos和mpmt_os2MPM中,但是事實上沒用任何用處,只不過是個擺飾罷了。