# Apache MPM 公共指令
| [說明](#calibre_link-11) | 收集了被多個多路處理模塊(MPM)實現的公共指令 |
| --- | --- |
| [狀態](#calibre_link-12) | MPM |
## AcceptMutex 指令
| [說明](#calibre_link-18) | Apache用于串行化多個子進程在(多個)網絡套接字(socket)上接受請求的方法 |
| --- | --- |
| [語法](#calibre_link-19) | `AcceptMutex Default|method` |
| [默認值](#calibre_link-24) | `AcceptMutex Default` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `prefork`, `worker` |
`AcceptMutex`指令用于設置串行化多個子進程在(多個)網絡套接字上接受請求的方法。在2.0版本以前,只能在編譯時設定此方法。應當在這里使用的最佳方法取決于不同的硬件體系結構和操作系統。欲知詳情,請參見[性能調節](#calibre_link-262)文檔。
如果設置為`Default` ,那么將會使用編譯時自動選擇的默認值。其他可用的方法在下面列出。注意,并不是所有的方法在所有的平臺上都是可用的,如果指定了一個不可用的方法,將會在錯誤日志中記錄下這個不可用的方法。
`flock`
這種方法調用系統函數`flock(2)`來鎖定一個加鎖文件(其位置取決于`LockFile`指令)。
`fcntl`
這種方法調用系統函數`fcntl(2)`來鎖定一個加鎖文件(其位置取決于`LockFile`指令)。
`posixsem`
(2.0及更新版本)這種方法使用了POSIX信號燈。如果一個運行中的線程占有了互斥segfault ,則信號燈的所有者將不會被恢復,從而導致服務器的掛起和失去響應。
`pthread`
(1.3及更新版本)這種方法使用了POSIX互斥,按理應該可以用于所有完整實現了POSIX線程規范的體系中,但是似乎只能用在Solaris2.5及更新版本中,甚至只能在某種配置下才正常運作。如果遇到這種情況,則應該提防服務器的掛起和失去響應。只提供靜態內容的服務器可能不受影響。
`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`選項。
## CoreDumpDirectory 指令
| [說明](#calibre_link-18) | Apache使用的內核轉儲目錄 |
| --- | --- |
| [語法](#calibre_link-19) | `CoreDumpDirectory directory` |
| [默認值](#calibre_link-24) | `參見說明` |
| --- | --- |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `beos`, `mpm_winnt`, `prefork`, `worker` |
這個指令用于控制Apache使用的內核轉儲目錄。默認位于`ServerRoot`下,因為這個目錄通常對于運行服務器的用戶是不可寫的,內核轉儲一般也就不會寫入內容。如果你在調試中需要內核轉儲,你可以用這個指令來指定另外一個目錄。
### Linux上的內核轉儲
如果Apache以root身份啟動并切換至其他用戶,即使指定的轉儲目錄對進程是可寫的,Linux內核也將_禁止_Apache進行內核轉儲。但是Apache2.0.46及以后的版本在你明確指定`CoreDumpDirectory`的情況下,能夠在Linux2.4以上的版本中強制實現內核轉儲。
## EnableExceptionHook 指令
| [說明](#calibre_link-18) | 在子進程崩潰以后啟用一個鉤子來運行異常處理程序 |
| --- | --- |
| [語法](#calibre_link-19) | `EnableExceptionHook On|Off` |
| [默認值](#calibre_link-24) | `EnableExceptionHook Off` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `prefork`, `worker` |
| [兼容性](#calibre_link-137) | 僅在 Apache 2.0.49 及以后的版本中可用 |
因為安全原因,這個指令僅在編譯時使用了 `--enable-exception-hook` 選項的情況下才可用。它會在一個子進程崩潰以后啟用一個鉤子(hook)來運行一個外部模塊以做些后繼處理。
目前有兩個模塊(`mod_whatkilledus`和`mod_backtrace`)可以被鉤子使用。請參見Jeff Trawick的[EnableExceptionHook site](http://www.apache.org/~trawick/exception_hook.html)以獲得更多信息。
## GracefulShutdownTimeout 指令
| [說明](#calibre_link-18) | 指定優雅停止服務器的超時秒數 |
| --- | --- |
| [語法](#calibre_link-19) | `GracefulShutDownTimeout seconds` |
| [默認值](#calibre_link-24) | `GracefulShutDownTimeout 0` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `prefork`, `worker`, `event` |
| [兼容性](#calibre_link-137) | 僅在 Apache 2.2 及以后的版本中可用 |
`GracefulShutdownTimeout`設置服務器在收到"優雅停止"信號后最多允許使用多少秒來處理尚未完成的連接,超時后服務器將強行退出。
設為"0"表示永不超時,也就是服務器必須在處理完所有尚未完成的請求之后才能退出。
## Group 指令
| [說明](#calibre_link-18) | 對請求提供服務的Apache子進程運行時的用戶組 |
| --- | --- |
| [語法](#calibre_link-19) | `Group unix-group` |
| [默認值](#calibre_link-24) | `Group #-1` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `beos`, `mpmt_os2`, `prefork`, `worker` |
| [兼容性](#calibre_link-137) | Apache2.0以后只對全局配置有效 |
`Group`指令指定了用于對客戶端請求提供服務的Apache子進程運行時的用戶組。為了使用這個指令,Apache必須以`root`初始化啟動,否則在切換用戶組時會失敗,并繼續以初始化啟動時的用戶組運行。Unix-group可以是下列之一:
用戶組的名稱
通過名稱引用組。
"`#`"號后跟一個組編號(GID)
通過編號引用組。
### 示例
```
Group www-group
```
建議你專門為Apache服務器新建一個用戶組。一些管理員使用`nobody`用戶,但是這并非總是可用或是合適的。
### 安全
不要將`Group`(或`User`)設置成`root` ,除非你明確知道自己在做什么,并且明白其風險所在。
特別提示:在`<VirtualHost>`段中使用該指令已經不再被支持了。你可以使用`suexec`的`SuexecUserGroup`指令來達到這個目的。
### 注意
雖然`Group`指令也存在于`beos`和`mpmt_os2`MPM中,但是事實上沒用任何用處,只不過是個擺飾罷了。
## Listen 指令
| [說明](#calibre_link-18) | 服務器監聽的IP地址和端口 |
| --- | --- |
| [語法](#calibre_link-19) | `Listen [IP-address:]portnumber [protocol]` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `beos`, `mpm_netware`, `mpm_winnt`, `mpmt_os2`, `prefork`, `worker`, `event` |
| [兼容性](#calibre_link-137) | 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問題](#calibre_link-55)
* [地址和端口綁定](#calibre_link-254)
## ListenBackLog 指令
| [說明](#calibre_link-18) | 半鏈接(pending connection)隊列的最大長度 |
| --- | --- |
| [語法](#calibre_link-19) | `ListenBacklog backlog` |
| [默認值](#calibre_link-24) | `ListenBacklog 511` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `beos`, `mpm_netware`, `mpm_winnt`, `mpmt_os2`, `prefork`, `worker` |
半鏈接(pending connection)隊列的最大長度。一般不需要調整此項參數,然而在一些系統上,必須增大此值以抵御TCP SYN 洪水攻擊。參見操作系統的`listen(2)`系統調用的后備參數。
操作系統常常將此值限制為一個較小的數字,具體根據操作系統的不同而不同。需要注意的是,許多操作系統并不是正好使用后備數值,而是取決于設置的值(通常大于后備值)。
## LockFile 指令
| [說明](#calibre_link-18) | 接受串行鎖文件的位置 |
| --- | --- |
| [語法](#calibre_link-19) | `LockFile filename` |
| [默認值](#calibre_link-24) | `LockFile logs/accept.lock` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `prefork`, `worker` |
`LockFile`指令設置當`AcceptMutex`指令的值是`fcntl`或`flock`的時候,Apache使用的鎖文件的位置。該指令通常保持它的默認值。改變默認值的主要原因是`logs`目錄位于一個NFS文件系統上,因為鎖**文件必須位于本地磁盤上**。主服務器進程的PID會自動添加到文件名后面。
### 安全
最好_不要_將此文件放在任何人都可以具有寫權限的目錄(比如`/var/tmp`)中,因為別人可以通過建立一個與服務器企圖建立的鎖文件同名的文件,來阻止服務器啟動,從而造成一個拒絕服務攻擊。
### 參見
* `AcceptMutex`
## MaxClients 指令
| [說明](#calibre_link-18) | 允許同時伺服的最大接入請求數量 |
| --- | --- |
| [語法](#calibre_link-19) | `MaxClients number` |
| [默認值](#calibre_link-24) | `參見下面的說明` |
| --- | --- |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `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`的值。
## MaxMemFree 指令
| [說明](#calibre_link-18) | 主內存分配程序在未調用`free()`的情況下允許持有的最大自由內存數量(KB) |
| --- | --- |
| [語法](#calibre_link-19) | `MaxMemFree KBytes` |
| [默認值](#calibre_link-24) | `MaxMemFree 0` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `beos`, `mpm_netware`, `prefork`, `worker`, `mpm_winnt` |
`MaxMemFree`指令用于設置主內存分配程序在未調用`free()`的情況下允許持有的最大自由內存數量(KB)。若未設置或設置為"0",將表示無限制。
## MaxRequestsPerChild 指令
| [說明](#calibre_link-18) | 每個子進程在其生存期內允許伺服的最大請求數量 |
| --- | --- |
| [語法](#calibre_link-19) | `MaxRequestsPerChild number` |
| [默認值](#calibre_link-24) | `MaxRequestsPerChild 10000` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `mpm_netware`, `mpm_winnt`, `mpmt_os2`, `prefork`, `worker` |
`MaxRequestsPerChild`指令設置每個子進程在其生存期內允許伺服的最大請求數量。到達`MaxRequestsPerChild`的限制后,子進程將會結束。如果`MaxRequestsPerChild`為"`0`",子進程將永遠不會結束。
### 不同的默認值
在`mpm_netware`和`mpm_winnt`上的默認值是"`0`"。
將`MaxRequestsPerChild`設置成非零值有兩個好處:
* 可以防止(偶然的)內存泄漏無限進行,從而耗盡內存。
* 給進程一個有限壽命,從而有助于當服務器負載減輕的時候減少活動進程的數量。
### 注意
對于`KeepAlive`鏈接,只有第一個請求會被計數。事實上,它改變了每個子進程限制最大_鏈接_數量的行為。
## MaxSpareThreads 指令
| [說明](#calibre_link-18) | 最大空閑線程數 |
| --- | --- |
| [語法](#calibre_link-19) | `MaxSpareThreads number` |
| [默認值](#calibre_link-24) | `參見下面的說明` |
| --- | --- |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `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`
## MinSpareThreads 指令
| [說明](#calibre_link-18) | 最小空閑線程數 |
| --- | --- |
| [語法](#calibre_link-19) | `MinSpareThreads number` |
| [默認值](#calibre_link-24) | `參見下面的說明` |
| --- | --- |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `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`
## PidFile 指令
| [說明](#calibre_link-18) | 服務器用于記錄父進程(監控進程)PID的文件 |
| --- | --- |
| [語法](#calibre_link-19) | `PidFile filename` |
| [默認值](#calibre_link-24) | `PidFile logs/httpd.pid` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `beos`, `mpm_winnt`, `mpmt_os2`, `prefork`, `worker` |
`PidFile`指令設置服務器用于記錄父進程(監控進程)PID的文件。如果指定的不是絕對路徑,那么將視為基于`ServerRoot`的相對路徑。
### 示例
```
PidFile /var/run/apache.pid
```
這個文件通常用來便于給服務器父進程發送一個信號,用于關閉或重啟服務器,以重新打開`ErrorLog`和`TransferLog`文件、重新讀取配置文件。這些可以通過發送一個"SIGHUP"(kill -1)信號到`PidFile`記錄的進程PID。
`PidFile`和其他日志文件一樣要注意放置位置和[安全](#calibre_link-281)問題。
### 注意
從Apache2開始,推薦使用`apachectl`腳本來啟動或停止服務器。
## ReceiveBufferSize 指令
| [說明](#calibre_link-18) | TCP接收緩沖區大小(字節) |
| --- | --- |
| [語法](#calibre_link-19) | `ReceiveBufferSize bytes` |
| [默認值](#calibre_link-24) | `ReceiveBufferSize 0` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `beos`, `mpm_netware`, `mpm_winnt`, `mpmt_os2`, `prefork`, `worker` |
這個指令設置服務器的TCP接收緩沖區的大小(字節)。提高這個值會導致兩個后果:高速度和高潛伏時間(100ms左右)。
如果設置為"`0`",將使用操作系統默認值。
## ScoreBoardFile 指令
| [說明](#calibre_link-18) | 存儲子進程協調數據(coordination data)的文件 |
| --- | --- |
| [語法](#calibre_link-19) | `ScoreBoardFile file-path` |
| [默認值](#calibre_link-24) | `ScoreBoardFile logs/apache_status` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `beos`, `mpm_winnt`, `prefork`, `worker` |
Apache使用記分板(scoreboard)在父進程和子進程之間進行通信。一些體系結構要求有一個文件來幫助通信。如果未指定這個文件,Apache會首先嘗試在匿名共享內存中建立完整的記分板(scoreboard),若失敗,將繼續嘗試使用基于文件的共享存儲器在磁盤上建立這個文件。若利用這個指令指定這個文件的位置,則Apache將總是在磁盤上建立這個文件。
### 示例
```
ScoreBoardFile /var/run/apache_status
```
基于文件的共享存儲器對于使用直接訪問記分板(scoreboard)的第三方程序是很有用的。
將`ScoreBoardFile`放置在RAM disk中會對速度提升有很大幫助。但是同其他日志文件一樣也要注意放置位置和[安全](#calibre_link-263)問題。
### 參見
* [停止和重啟Apache](#calibre_link-31)
## SendBufferSize 指令
| [說明](#calibre_link-18) | TCP發送緩沖區大小(字節) |
| --- | --- |
| [語法](#calibre_link-19) | `SendBufferSize bytes` |
| [默認值](#calibre_link-24) | `SendBufferSize 0` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `beos`, `mpm_netware`, `mpm_winnt`, `mpmt_os2`, `prefork`, `worker` |
這個指令設置服務器的TCP發送緩沖區的大小(字節)。提高這個值會導致兩個后果:高速度和高潛伏時間(100ms左右)。
如果設置為"`0`",將使用操作系統默認值。
## ServerLimit 指令
| [說明](#calibre_link-18) | 服務器允許配置的進程數上限 |
| --- | --- |
| [語法](#calibre_link-19) | `ServerLimit number` |
| [默認值](#calibre_link-24) | `參見下面的說明` |
| --- | --- |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `prefork`, `worker` |
對于`prefork`MPM,這個指令設置了`MaxClients`最大允許配置的數值。對于`worker`MPM,這個指令和`ThreadLimit`結合使用設置了`MaxClients`最大允許配置的數值。任何在重啟期間對這個指令的改變都將被忽略,但對`MaxClients`的修改卻會生效。
使用這個指令時要特別當心。如果將`ServerLimit`設置成一個高出實際需要許多的值,將會有過多的共享內存被分配。如果將`ServerLimit`和`MaxClients`設置成超過系統的處理能力,Apache可能無法啟動,或者系統將變得不穩定。
對于`prefork`MPM,只有在你需要將`MaxClients`設置成高于默認值256的時候才需要使用這個指令。要將此指令的值保持和`MaxClients`一樣。
對于`worker`MPM,只有在你需要將`MaxClients`和`ThreadsPerChild`設置成需要超過默認值16個子進程的時候才需要使用這個指令。不要將該指令的值設置的比`MaxClients`需要的子進程數量高。
### 注意
Apache在編譯時內部有一個硬限制"`ServerLimit 20000`"(對于`prefork`MPM為"`ServerLimit 200000`")。你不能超越這個限制。
### 參見
* [停止和重啟Apache](#calibre_link-31)
## StartServers 指令
| [說明](#calibre_link-18) | 服務器啟動時建立的子進程數 |
| --- | --- |
| [語法](#calibre_link-19) | `StartServers number` |
| [默認值](#calibre_link-24) | `參見下面的說明` |
| --- | --- |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `mpmt_os2`, `prefork`, `worker` |
`StartServers`指令設置了服務器啟動時建立的子進程數量。因為子進程數量動態的取決于負載的輕重,所有一般沒有必要調整這個參數。
不同的MPM默認值也不一樣。對于`worker`默認值是"`3`"。對于`prefork`默認值是"`5`",`mpmt_os2`是"`2`"。
## StartThreads 指令
| [說明](#calibre_link-18) | 服務器啟動時建立的線程數 |
| --- | --- |
| [語法](#calibre_link-19) | `StartThreads number` |
| [默認值](#calibre_link-24) | `參見下面的說明` |
| --- | --- |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `beos`, `mpm_netware` |
設置了服務器啟動時建立的線程數量。因為線程數量動態的取決于負載的輕重,所有一般沒有必要調整這個參數。
對于`mpm_netware` ,默認值是"`50`",由于只有一個進程,因此所有的線程都將用于伺服請求。
對于`beos` ,默認值是"`10`",同樣也是所有的線程都將用于伺服請求。
## ThreadLimit 指令
| [說明](#calibre_link-18) | 每個子進程可配置的線程數上限 |
| --- | --- |
| [語法](#calibre_link-19) | `ThreadLimit number` |
| [默認值](#calibre_link-24) | `參見下面的說明` |
| --- | --- |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `mpm_winnt`, `worker` |
| [兼容性](#calibre_link-137) | 僅用于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`"),你不能超越這個限制。
## ThreadsPerChild 指令
| [說明](#calibre_link-18) | 每個子進程建立的線程數 |
| --- | --- |
| [語法](#calibre_link-19) | `ThreadsPerChild number` |
| [默認值](#calibre_link-24) | `參見下面的說明` |
| --- | --- |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `mpm_winnt`, `worker` |
這個指令設置了每個子進程建立的線程數。子進程在啟動時建立這些線程后就不再建立新的線程了。如果使用一個類似于`mpm_winnt`只有一個子進程的MPM,這個數值要足夠大,以便可以處理可能的請求高峰。如果使用一個類似于`worker`有多個子進程的MPM,每個子進程所擁有的_所有_線程的總數要足夠大,以便可以處理可能的請求高峰。
對于`mpm_winnt`,`ThreadsPerChild`的默認值是`64`;對于其他MPM是`25`。
## ThreadStackSize 指令
| [說明](#calibre_link-18) | 處理客戶端連接的線程使用的棧尺寸(字節) |
| --- | --- |
| [語法](#calibre_link-19) | `ThreadStackSize size` |
| [默認值](#calibre_link-24) | `NetWare上為65536;其它平臺上等于操作系統默認值` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `mpm_netware`, `mpm_winnt`, `worker` |
| [兼容性](#calibre_link-137) | 僅在 Apache 2.1 及以后的版本中可用 |
`ThreadStackSize`指令設置了處理客戶端連接(包括調用模塊以協助處理)的線程允許使用的最大棧尺寸(字節)。在大多數情況下,操作系統默認的棧尺寸很合理,但是在某些情況下,需要調整這個值:
* 在默認棧尺寸較小的平臺上(比如HP-UX),Apache可能會在使用一些需要較大棧尺寸的第三方模塊時崩潰。這樣的問題可以通過將`ThreadStackSize`設置為一個較大的值來解決。這種調整應當僅僅在第三方模塊提供者明確要求的情況下才需要,或者是您通過診斷確定是由于棧空間太小而導致崩潰。
* 在某些平臺上,如果默認的棧空間大于服務器運行所需空間,那么將`ThreadStackSize`值降低到小于操作系統默認值可以讓每個進程中允許生成的最大線程數量增加。這種類型的調整應該僅在測試環境中使用,并且對所有服務器進程進行充分的測試,因為處理某些罕見的請求需要較大的棧空間。一個很小的服務器配置變化就有可能使得當前的`ThreadStackSize`設置變得不合適。
## User 指令
| [說明](#calibre_link-18) | 實際服務于請求的子進程運行時的用戶 |
| --- | --- |
| [語法](#calibre_link-19) | `User unix-userid` |
| [默認值](#calibre_link-24) | `User #-1` |
| [作用域](#calibre_link-20) | server config |
| [狀態](#calibre_link-21) | MPM |
| [模塊](#calibre_link-22) | `prefork`, `worker` |
| [兼容性](#calibre_link-137) | 2.0版本起僅在全局服務器配置中可用 |
`User`指令用于設置實際提供服務的子進程的用戶。為了使用這個指令,服務器必須以`root`身份啟動和初始化。如果你以非`root`身份啟動服務器,子進程將不能夠切換至非特權用戶,并繼續以啟動服務器的原始用戶身份運行。如果確實以`root`用戶啟動了服務器,那么父進程將仍然以`root`身份運行。Unix-userid是下列值之一:
一個用戶名
通過用戶名引用用戶
"#"號后面跟一個用戶編號
通過用戶編號引用用戶
用于運行子進程的用戶必須是一個沒有特權的用戶,這樣才能保證子進程無權訪問那些不想為外界所知的文件,同樣的,該用戶亦需沒有執行那些不應當被外界執行的程序的權限。強烈推薦你專門為Apache子進程建立一個單獨的用戶和組。一些管理員使用`nobody`用戶,但是這并不能總是符合要求,因為可能有其他程序也在使用這個用戶。
### 安全
不要將`User`(或`Group`)設置成`root` ,除非你明確知道自己在做什么,并且明白其風險所在。
特別提示:在`<VirtualHost>`段中使用該指令已經不再被支持了。你可以使用`suexec`的`SuexecUserGroup`指令來達到這個目的。
### 注意
雖然`User`指令也存在于`beos`和`mpmt_os2`MPM中,但是事實上沒用任何用處,只不過是個擺飾罷了。
- Apache HTTP Server Version 2.2 文檔 [最后更新:2006年3月21日]
- 版本說明
- 從1.3升級到2.0
- 從2.0升級到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 參考手冊
- 編譯與安裝
- 啟動Apache
- 停止和重啟
- 配置文件
- 配置段(容器)
- 緩沖指南
- 服務器全局配置
- 日志文件
- 從URL到文件系統的映射
- 安全方面的提示
- 動態共享對象(DSO)支持
- 內容協商
- 自定義錯誤響應
- 地址和端口的綁定(Binding)
- 多路處理模塊
- Apache的環境變量
- Apache處理器的使用
- 過濾器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重寫指南
- Apache虛擬主機文檔
- 基于主機名的虛擬主機
- 基于IP地址的虛擬主機
- 大批量虛擬主機的動態配置
- 虛擬主機示例
- 深入研究虛擬主機的匹配
- 文件描述符限制
- 關于DNS和Apache
- 常見問題
- 經常問到的問題
- Apache的SSL/TLS加密
- SSL/TLS高強度加密:緒論
- SSL/TLS高強度加密:兼容性
- SSL/TLS高強度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 認證、授權、訪問控制
- CGI動態頁面
- 服務器端包含入門
- .htaccess文件
- 用戶網站目錄
- 針對特定平臺的說明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上編譯Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服務器和支持程序
- httpd - Apache超文本傳輸協議服務器
- ab - Apache HTTP服務器性能測試工具
- apachectl - Apache HTTP服務器控制接口
- apxs - Apache 擴展工具
- configure - 配置源代碼樹
- dbmmanage - 管理DBM格式的用戶認證文件
- htcacheclean - 清理磁盤緩沖區
- htdbm - 操作DBM密碼數據庫
- htdigest - 管理用于摘要認證的用戶文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本認證的用戶文件
- logresolve - 解析Apache日志中的IP地址為主機名
- rotatelogs - 滾動Apache日志的管道日志程序
- suexec - 在執行外部程序之前切換用戶
- 其他程序
- 雜項文檔
- 與Apache相關的標準
- Apache模塊
- 描述模塊的術語
- 描述指令的術語
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模塊 mod_actions
- Apache模塊 mod_alias
- Apache模塊 mod_asis
- Apache模塊 mod_auth_basic
- Apache模塊 mod_auth_digest
- Apache模塊 mod_authn_alias
- Apache模塊 mod_authn_anon
- Apache模塊 mod_authn_dbd
- Apache模塊 mod_authn_dbm
- Apache模塊 mod_authn_default
- Apache模塊 mod_authn_file
- Apache模塊 mod_authnz_ldap
- Apache模塊 mod_authz_dbm
- Apache模塊 mod_authz_default
- Apache模塊 mod_authz_groupfile
- Apache模塊 mod_authz_host
- Apache模塊 mod_authz_owner
- Apache模塊 mod_authz_user
- Apache模塊 mod_autoindex
- Apache模塊 mod_cache
- Apache模塊 mod_cern_meta
- Apache模塊 mod_cgi
- Apache模塊 mod_cgid
- Apache模塊 mod_charset_lite
- Apache模塊 mod_dav
- Apache模塊 mod_dav_fs
- Apache模塊 mod_dav_lock
- Apache模塊 mod_dbd
- Apache模塊 mod_deflate
- Apache模塊 mod_dir
- Apache模塊 mod_disk_cache
- Apache模塊 mod_dumpio
- Apache模塊 mod_echo
- Apache模塊 mod_env
- Apache模塊 mod_example
- Apache模塊 mod_expires
- Apache模塊 mod_ext_filter
- Apache模塊 mod_file_cache
- Apache模塊 mod_filter
- Apache模塊 mod_headers
- Apache模塊 mod_ident
- Apache模塊 mod_imagemap
- Apache模塊 mod_include
- Apache模塊 mod_info
- Apache模塊 mod_isapi
- Apache模塊 mod_ldap
- Apache模塊 mod_log_config
- Apache模塊 mod_log_forensic
- Apache模塊 mod_logio
- Apache模塊 mod_mem_cache
- Apache模塊 mod_mime
- Apache模塊 mod_mime_magic
- Apache模塊 mod_negotiation
- Apache模塊 mod_nw_ssl
- Apache模塊 mod_proxy
- Apache模塊 mod_proxy_ajp
- Apache模塊 mod_proxy_balancer
- Apache模塊 mod_proxy_connect
- Apache模塊 mod_proxy_ftp
- Apache模塊 mod_proxy_http
- Apache模塊 mod_rewrite
- Apache模塊 mod_setenvif
- Apache模塊 mod_so
- Apache模塊 mod_speling
- Apache模塊 mod_ssl
- Apache模塊 mod_status
- Apache模塊 mod_suexec
- Apache模塊 mod_unique_id
- Apache模塊 mod_userdir
- Apache模塊 mod_usertrack
- Apache模塊 mod_version
- Apache模塊 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 詞匯和索引
- 詞匯表
- 指令索引
- 指令速查
- 模塊索引
- 站點導航