Apache三種工作模式
1. prefork模式(默認模式)
profork模式實現了一種非線程、預派生的Web服務器,用的是進程去處理請求,所以比較容易消耗內存,但是穩定性好,某個進程出現問題不會影響到其他請求。
2. worker模式
worker模式使用多個子進程,每個子進程有多個線程、由於使用的是線程去處理請求,消耗內存小,適合高流量的請求,但是如果某個進程出現問題,那麽這個進程下的線程都會出現問題,即穩定性不是很好。
3. event模式
event模式為了解決keep-alive保持長連接出現的一種工作模式,使用keep-alive長連接的時候,某個線程會一直被占用,即使中間沒有請求,需要等到超時才會被釋放,所以這個時候就出現了event的工作模式。
prefork與worker模式比較
- prefork模式使用多個子進程,每個子進程只有一個線程,每個進程在某個確定的時間只能維持一個連接;
- worker模式使用多個子進程,每個子進程有多個線程,每個線程在某個確定的時間只能維持一個連接,適用於高流量的HTTP服務器上;
總的來說,prefork方式速度要稍高於worker,但是prefork所需要的CPU和Memory資源也稍高於worker。
如何配置模塊?
以下主要介紹prefork模式和worker模式
一、prefork模式
1. 編譯安裝時指定工作模式:
./configure \
--prefix=/usr/local/httpd \--enable-deflate \
--with-mpm=prefork \ #選用prefork模式
--enable-expires \
--enable-so \
--enable-rewrite \
--enable-charset-lite \
--enable-cgi
2. 使用httpd -l命令查看當前工作模式
[root@localhost ~]# httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
prefork.c #代表當前為prefork模式
3. 使用lsof命令可以查看Apache進程的運行情況
[root@localhost ~]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 31239 root 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31240 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31241 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31242 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31243 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31244 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31491 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31508 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31511 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31543 daemon 3u IPv4 31675 0t0 TCP localhost.localdomain:http (LISTEN)
解釋如下:有1個root用戶運行的主進程,10個daemon用戶運行的子進程。這裏使用了prefork模式,采用了預派發的方式,10個子進程就是服務器啟動時預先創建的,當有用戶請求時,將直接使用已經創建好的子進程進行處理,可以減少創建子進程的時間,增加響應速度,預先創建多少個子進程由prefork的參數進行設置。
4. 啟動prefork模塊,並配置其參數
vim /etc/httpd.conf
#切換到軟件目錄下
cd /usr/local/httpd/conf/extra/
#編輯配置文件
vim httpd-mpm.conf
prefork參數說明:
- ServerLimit:最大進程數
- StartServers:啟動的時候創建的進程數量
- MinSpareServers:最少空閑進程
- MaxSpareServers:最多空閑進程
- MaxClients:最多創建多少個子進程用來處理請求
- MaxRequestsPerChild:每個進程處理的最大請求數,如果達到請求數,進程即被銷毀,如果設置為0,子進程永遠呢不會結束
5. 再次使用lsof命令可以查看Apache進程的運行情況
[root@localhost extra]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 31588 root 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31589 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31590 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31591 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31592 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31593 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31594 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31595 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31596 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31597 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31598 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31599 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31600 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31601 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31602 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31603 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31604 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31605 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31606 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31607 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 31608 daemon 3u IPv4 40709 0t0 TCP localhost.localdomain:http (LISTEN)
這樣啟動Apache服務器時便創建了20個進程,說明配置成功了。
二、worker模式
1. 編譯安裝時指定工作模式:
./configure \
--prefix=/usr/local/httpd \
--enable-deflate \
--with-mpm=worker \ #worker工作模式
--enable-expires \
--enable-so \
--enable-rewrite \
--enable-charset-lite \
--enable-cgi
2. 使用httpd -l命令查看當前工作模式
[root@localhost httpd-2.4.2]# httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
worker.c #代表當前為worker模式
3. 啟動worker模塊,並配置其參數
vim /etc/httpd.conf
#切換到軟件目錄下
cd /usr/local/httpd/conf/extra/
#編輯配置文件
vim httpd-mpm.conf
4. 使用lsof命令可以查看Apache進程的運行情況
[root@localhost httpd-2.4.2]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 47560 root 3u IPv4 50706 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 47561 daemon 3u IPv4 50706 0t0 TCP localhost.localdomain:http (LISTEN)
httpd 47562 daemon 3u IPv4 50706 0t0 TCP localhost.localdomain:http (LISTEN)
worker參數說明:
- ServerLimit:最大進程數
- ThreadLimit:每個子進程的最大線程數
- StartServers:服務器啟動時建立的子進程數
- MaxClients:允許同時接受的最大接入請求數量
- MinSpareThreads:最小空閑線程數
- MaxSpareThreads:最大空閑線程數
- ThreadsPerChild:每個子進程建立的常駐線程數
- MaxRequestsChild:設置每個子進程在其生存期內允許服務的最大請求數,設置為0,子進程將永遠不會結束
具體參數調優這需要對服務器進行負載壓力測試後才能確保服務器穩定的基礎上實現最高的性能。
常用的性能測試工具有以下幾種:ab、http_load、webbench、siege。ab是Apache自帶的壓力測試工具,非常實用,可以模擬多線程並發請求,測試服務器的負載壓力。
在性能調整優化過程中,優化前先使用ab進行壓力測試,優化後再進行壓力了測試,對比兩次測試的結果,看優化效果是否明顯,再決定是否啟用優化方案。
Apache三種工作模式