一,Apache即現階段比較流行的Web服務,是一個多模塊化的Web服務,使用簡單,速度快,穩定性好,可以做負載均衡及代理服務器來使用。
二,Apache有三種工作模式分別是 :Prefork MPM
Worker MPM
Event MPM
1,Prefork MPM
默認的工作模式是Prefork MPM,這種模式采用的是預派生子進程方式,用單獨的子進程來處理請求,子進程間互相獨立,互不影響,大大的提高了穩定性,但每個進程都會占用內存,所以消耗系統資源過高;
Prefork MPM 工作原理:控制進程Master首先會生成“StartServers”個進程,“StartServers”可以在Apache主配置文件里配置,然后為了滿足“MinSpareServers”設置的最小空閑進程個數,會建立一個空閑進程,等待一秒鍾,繼續創建兩個空閑進程,再等待一秒鍾,繼續創建四個空閑進程,以此類推,會不斷的遞歸增長創建進程,最大同時創建32個空閑進程,直到滿足“MinSpareServers”設置的空閑進程個數為止。Apache的預派生模式不必在請求到來的時候創建進程,這樣會減小系統開銷以增加性能,不過Prefork MPM是基於多進程的模式工作的,每個進程都會占用內存,這樣資源消耗也較高。
2,Worker MPM
Worker MPM是Apche 2.0版本中全新的支持多進程多線程混合模型的MPM,由於使用線程來處理HTTP請求,所以效率非常高,而對系統的開銷也相對較低,Worker MPM也是基於多進程的,但是每個進程會生成多個線程,由線程來處理請求,這樣可以保證多線程可以獲得進程的穩定性;
Worker MPM工作原理: 控制進程Master在最初會建立“StartServers”個進程,然后每個進程會創建“ThreadPerChild”個線程,多線程共享該進程內的資源,同時每個線程獨立的處理HTTP請求,為了不在請求到來的時候創建線程,Worker MPM也可以設置最大最小空閑線程,Worker MPM模式下同時處理的請求=ThreadPerChild*進程數,也就是MaxClients,如果服務負載較高,當前進程數不滿足需求,Master控制進程會fork新的進程,最大進程數不能超過ServerLimit數,如果需要,可以調整這些對應的參數,比如,如果要調整StartServers的數量,則也要調整 ServerLimit的值
3,Event MPM
這個是 Apache中最新的模式,在現在版本里的已經是穩定可用的模式。它和 worker模式很像,最大的區別在於,它解決了 keep-alive 場景下 ,長期被占用的線程的資源浪費問題(某些線程因為被keep-alive,掛在那里等待,中間幾乎沒有請求過來,一直等到超時)。
event MPM中,會有一個專門的線程來管理這些 keep-alive 類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢后,又允許它釋放。這樣,一個線程就能處理幾個請求了,實現了異步非阻塞。
event MPM在遇到某些不兼容的模塊時,會失效,將會回退到worker模式,一個工作線程處理一個請求。官方自帶的模塊,全部是支持event MPM的。
總結:
Prefork MPM: 使用多個進程,每個進程只有一個線程,每個進程再某個確定的時間只能維持一個連接,有點是穩定,缺點是內存消耗過高。
Worker MPM: 使用多個進程,每個進程有多個線程,每個線程在某個確定的時間只能維持一個連接,內存占用比較小,是個大並發、高流量的場景,缺點是一個線程崩潰,整個進程就會連同其任何線程一起掛掉。
Event MPM: 使用多進程多線程+epoll的模式,
注意一點,event MPM需要Linux系統(Linux 2.6+)對Epoll的支持,才能啟用。
還有,需要補充的是HTTPS的連接(SSL),它的運行模式仍然是類似worker的方式,線程會被一直占用,知道連接關閉。部分比較老的資料里,說event MPM不支持SSL,那個說法是幾年前的說法,現在已經支持了。