1. 程式人生 > >Centos7之Apache的三種工作模式

Centos7之Apache的三種工作模式

滿足 read 高流量 event 也有 聲明 vpd 問題 出現

Apache工作模式簡介

Apache 2.X 支持插入式並行處理模塊,稱為多進程處理模塊(MPM)。在編譯apache時必須選擇也只能選擇一個MPM,對類UNIX系統,有幾個不同的MPM可供選擇,它們會影響到apache的速度和可伸縮性。

Apache的三種工作模式

1、prefork模式

prefork是一個非線程型的、預派生的MPM,使用多個進程,每個進程在某個確定的時間只單獨處理一個連接,效率高,但內存使用比較大。
技術分享圖片

優點:

適合於沒有線程安全庫,需要避免線程兼容性問題的系統。它是要求將每個請求相互獨立的情況下最好的MPM,這樣若一個請求出現問題就不會影響到其他請求。

缺點:

一個進程相對占用更多的系統資源,消耗更多的內存。而且,它並不擅長處理高並發請求,在這種場景下,它會將請求放進隊列中,一直等到有可用進程,請求才會被處理。

2、worker模式

worker使用了多進程和多線程的混合模式,worker模式也同樣會先預派生一些子進程,然後每個子進程創建一些線程,同時包括一個監聽線程,每個請求過來會被分配到一個線程來服務。
技術分享圖片

優點:

線程比起進程會更輕量,因為線程是通過共享父進程的內存空間,因此,內存的占用會減少一些,在高並發,高流量的場景下會比prefork有更多可用的線程,表現會更優秀一些。

缺點:

如果一個線程出現了問題也會導致同一進程下的線程出現問題,如果是多個線程出現問題,也只是影響Apache的一部分,而不是全部。由於用到多進程多線程,需要考慮到線程的安全了,在使用keep-alive長連接的時候,某個線程會一直被占用,即使中間沒有請求,需要等待到超時才會被釋放(prefork模式也有這個問題)。

註:Worker模式下所能同時處理的請求總數是由子進程總數乘以ThreadsPerChild 值決定的,應該大於等於MaxRequestWorkers。如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。默認最大的子進程總數是16,加大時 也需要顯式聲明ServerLimit(最大值是20000)。需要註意的是,如果顯式聲明了ServerLimit,那麽它乘以 ThreadsPerChild的值必須大於等於MaxRequestWorkers,而且MaxRequestWorkers必須是ThreadsPerChild的整數倍,否則 Apache將會自動調節到一個相應值。

3、Event模式

Apache最新的工作模式,它和worker模式很像。
技術分享圖片

優點:

不同的是在於它解決了keep-alive長連接的時候占用線程資源被浪費的問題(HTTP的Keepalive方式能減少TCP連接數量和網絡負載),在event工作模式中,會有一些專門的線程用來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務器的線程,執行完畢後,又允許它釋放。這增強了在高並發場景下的請求處理

缺點:

event MPM在遇到某些不兼容的模塊時,會失效,將會回退到worker模式,一個工作線程處理一個請求。官方自帶的模塊,全部是支持event MPM的。註意一點,event MPM需要Linux系統(Linux 2.6+)對EPoll的支持,才能啟用。

註:HTTPS的連接(SSL),它的運行模式仍然是類似worker的方式,線程會被一直占用,知道連接關閉。部分比較老的資料裏,說event MPM不支持SSL,那個說法是幾年前的說法,現在已經支持了。

Apache三種工作模式的使用

1、使用yum或者rpm安裝httpd

註:默認使用的是prefork工作模式。

vi /etc/httpd/conf.modules.d/00-mpm.conf
技術分享圖片
註:Centos7修改apache工作模式,直接將前邊註釋去掉即可,切記將不用的也要註釋掉!

2、源碼安裝httpd

兩種編譯方式指定參數

方式一:

指定具體工作模式--with-mpm=prefork/worker/event

註:真實環境指定後邊其中一種即可!

方式二:

指定同時支持三種工作模式--enable-mpms-shared=all

註:建議使用這種,防止後期根據業務優化網站減少麻煩!

Centos7之Apache的三種工作模式