1. 程式人生 > >Apache 兩種工作模式 :prefork 、 worker

Apache 兩種工作模式 :prefork 、 worker

文章 serve 共享 生產 servers sta 能力 一個 請求

前言

1·最近這幾篇文章都在講Apache的一些安全與優化,這些針對服務器都是很重要的,掌握這些不僅提升了服務器的安全,還讓服務器的性能大大的提高。這樣就可以讓客戶有很好的體驗感。
2·今天這篇文章依舊是講Apache。但是,是講Apache的優化深入。Apache 的默認配置保證基本運行服務,但是在實際生產環境中,有時候需要把服務器性能發揮到最大化。


Apache的兩種工作模式:(prefork、worker)

很多朋友都知道Apache是當下Web服務器用得最廣泛也是最穩定的開源軟件之一,其中工作模式有很多種,最主要使用的兩種工作模式是:prefork模式、worker模式。下面會分別介紹這兩種模式。


Prefork 工作模式:

1·首先我們需要知道什麽是prefork 工作模式,其次需要知道這種工作模式的優點、缺點,最後我們需要會配置prefork 工作模式。這樣在生產環境種才會有利於我們靈活的根據自身需求的應用!
2·prefork 工作模式實現了一個非線程型的、預派發的Web服務器,它是要求將每個請求互相獨立的情況下最好的MPM(多路處理模塊)。每個進程在某個確定的時間只單獨處理一個請求。
3·prefork 模式由一個單獨的控制進程(父進程) 負責產生子進程,子進程用於監聽請求並作出應答,所以會一直存在空閑的子進程用於響應新的請求,這樣可加快響應速度。


prefork 的優點、缺點:

優點:
1·具有很強的自我調節能力,工作效率高,只需要很少的配置指令調整;
2·最重要的是MaxClients 的值可以是一個足夠大的數值以便處理潛在的請求高峰;
3·適合於沒有線程安全庫,需要避免線程兼容性問題的系統;
4·對線程調試困難的平臺更容易調試一些。
缺點:
1·MaxClients 的值不能太大,以免需要使用的內存超出物理內存的大小;
2·因為它會常備用空閑的子進程用於響應新的請求,所以會占用更多的內存;
技術分享圖片


prefork 配置方式:

1· 首先需要知道你Apache是否指定了工作模式
cd /usr/local/httpd/bin
./httpd -l (在bin目錄下執行此命令可以查看當前的工作模式)

2·如果沒有指定工作模式就需要在apache配置時加入參數
./configure --with-mpm=prefork
3·在主配置文件中打開MPM(多路處理模塊)路徑:
vim /etc/httpd.conf
Include conf/extra/httpd-mpm.conf (去掉註釋即可)
4·修改prefork工作模塊參數
vim /usr/local/httpd/conf/extra/httpd-mpm.conf
修改的值稍微調整,實際情況需要根據自身需求,內容如下:
<IfModule mpm_prefork_module> (prefork 模塊)
StartServers 10
MinSpareServers 10
MaxSpareServers 30
MaxRequestWorkers 1000
MaxConnectionsPerChild 5000
</IfModule>


prefork 配置參數表:

參數 說明
StartServers 啟動時創建的進程數量
MinSpareServers 最少空閑進程
MaxSpareServers 最多空閑進程
MaxRequestWorkers 最多創建多少個子進程來處理請求
MaxConnectionsPerChild 每個進程處理的最大請求數,如果達到請求數,進程即被銷毀,如果設置0,子進程永遠不會結束

Worker 工作模式:

1·Worker 模式使 Web 服務器支持混合的多線程多進程。
2·Worker 模塊每個進程能夠擁有的線程數量使固定的,服務器會根據負載情況增加或減少進程數量
3·一個單獨的控制進程(父進程)負載子進程的建立,而每個子進程能夠建立一定數量的服務現場和一個監聽線程,監聽接入請求並將其傳遞給服務線程處理和應答


Worker 的優點、缺點:

優點:
1·由於使用線程來處理請求,所以可以處理很多請求;
2·系統資源的開銷小於基於進程的MPM;
3·它使用了多進程,每個進程有多個線程,以獲得基於進程的 MPM 的穩定;
4·線程比起進程會更輕量,因為線程是通過共享父進程的內存空間,因此,內存的占用會減少一些
缺點:
1·如果一個線程出現了問題也會導致同一進程下的線程出現問題;
2·由於用到多進程多線程,需要考慮到線程的安全了,在使用keep-alive長連接的時候,某個線程會一直被占用,即使中間沒有請求,需要等待到超時才會被釋放(該問題在prefork模式下也存在)。


技術分享圖片


Worker 的配置方式:

1· 首先需要知道你Apache是否指定了工作模式
cd /usr/local/httpd/bin
./httpd -l (在bin目錄下執行此命令可以查看當前的工作模式)
2·如果沒有指定工作模式就需要在apache配置時加入參數
./configure --with-mpm=worker
3·在主配置文件中打開MPM(多路處理模塊)路徑:
vim /etc/httpd.conf
Include conf/extra/httpd-mpm.conf (去掉註釋即可)
4·修改worker工作模塊參數
vim /usr/local/httpd/conf/extra/httpd-mpm.conf
修改的值稍微調整,實際情況需要根據自身需求,內容如下:
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>


worker 配置參數表:

參數 說明
StartServers 服務器啟動時建立的子進程數
MinSpareThreads 最少空閑進程
MaxSpareThreads 最多空閑進程
ThreadsPerChild 每個子進程常駐執行線程數
MaxConnectionsPerChild 每個進程處理的最大請求數,如果達到請求數,進程即被銷毀,如果設置0,子進程永遠不會結束
MaxRequestWorkers 限定服務器同一時間內客戶端最大接入的請求數量

總結:

1· prefork 模式使用多個子進程,每個子進程只有一個線程。每個進程在一個確定的時間只能維持一個鏈接。但是它的內存占用比較多,可是也更容易調試!
2· worker 模式使用多個子進程,每個子進程有多個線程。每個線程在一個確定的時間只能維持一個鏈接。它的內存使用比prefork要低得多。


歸納:

總的來說,prefork 方式速度稍高於 worker ,然而它需要得 CPU 和內存資源也比 worker 多!實際應用中更推薦 prefork 得方式。

Apache 兩種工作模式 :prefork 、 worker