# Apache worker/prefork模式說明和優化配置
在linux中,我們可以利用 `http -l` 查看安裝的模塊時prefork模式還是worker模式。命令如下:
~~~
apachectl -l|grep -E 'prefork|worker'
apachectl -M |egrep 'prefork|worker'
~~~
## prefork模式
prefork模式使用的是多個子進程,每個子進程只有一個線程,每個進程在某個確定的時間只能維持一個連接。
### 工作原理
控制進程最初創建若干個子進程,為了不在請求來臨時再生成子進程,所以要根據需求不斷的創建新的子進程,最大可以達到每秒中32個知道滿足需求為止。
### 源代碼編譯安裝方法
在編譯安裝apache的過程中,加入參數`--with-mpm=prefork` **如果不加`--with-mpm`參數默認為prefork模式。**
**優點:** 效率高、穩定、安全。
**缺點:** 相比worker模式消耗資源更多。
### 配置參數說明
~~~
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestPerChild 5000
</IfModule>
~~~
* StartServers: 最初建立的子進程數量
* MinSpareServers: 最小空閑進程數,如果空閑的進程小于設定值,apache會自動創建進程,*如遇服務器并發負載較大時,可以考慮加大*。
* MaxSpareServers: 最大空閑進程數,如果空閑的進程大于設定值,apache會自動殺掉多余的進程,*如遇服務器并發負載較大時,可以考慮加大*。
* MaxClients: 設定的是apahce可以同時處理的請求數,**是對apache性能影響最大的參數**。
* MaxRequestPerChild: 每個子進程可處理的請求數。每個子進程在處理了"MaxRequestSperChild"個請求后會自動曉輝,0值意味著無限制,即子進程永不銷毀,雖然默認設為0可以使每個子進程處理更多的請求,但如果設成非零值也有如下好處,1. 防止你內存泄露 2. 在服務器負載下降的時候會自動減少子進程數。
## worker模式
worker模式是apache2.0+引入的新模式,是線程與進程的結合,在worker模式下會有多個子進程,每個子進程優惠有多個線程,每個線程在某個確定的事件只能維持一個連接。
### 工作原理
由主控制進程生成若干個子進程,每個子進程又包含固定的線程數,各個線程獨立處理請求,同樣為了不在請求到來時再生成線程,在配置文件中設置了最小和最大的空閑線程及所有子進程中的線程總數,如果現有子進程中的線程總數不能滿足并發及負載,控制進程將派生新的子進程。
### 源代碼編譯安裝方法
在配置編譯的過程中,加入參數`--with-mpm=worker` 如果不加的話系統會默認為prefork模式。
**另外worker模式**
優點:內存占用比prefork模式低,適合高并發高流量HTTP服務。
缺點:假如一個線程崩潰,整個進程就會連同其任何線程一起“掛掉”,由于線程共享內存空間,所以一個程式在運行時必須被系統識別為"每個線程都是安全的"。服務穩定性不如prefork模式。
### 配置參數說明
~~~
<IfModule mpm_worker_module>
StartServers 3
MaxClients 1600
serverLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadsPerChild 200
MaxRequestPerChild 0
</IfModule>
~~~
worker模式下所能同時處理的情趣總數是由子進程總數乘以ThreadSperChild值決定的,應該大于等于maxClients,如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。
默認最大的子進程數量總數為16,如需加大時需要聲明ServerLimit的值(最大為2000)
如果聲明了ServerLimit,那么他乘以ThreadsPerChild的值必須大于等于MaxClients,而且MaxClients必須是ThreadsPerChild的整數倍,否則Apache將自動調節到一個相應值。
MaxClients <= 總的進程數(ServerLimit) * 線程數(ThreadsPerChild)
MaxClients % ThreadsPerChild = 0
## 以上兩種模式的配置方法
打開apace的主配置文件找到
~~~
# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf
~~~
刪掉注釋開啟拓展配置。