[轉(zhuǎn)]淺析 Apache 工作原理

Apache是目前世界上使用最為廣泛的一種Web Server,它以跨平臺、高效和穩(wěn)定而聞名。那么Apache是怎樣工作的呢?

一、LAMP架構(gòu)

說起apache,那就不得不了解一下LAMP架構(gòu),LAMP架構(gòu)是較為流行的一套建站架構(gòu),因其通用、跨平臺、高性能、低價(jià)格的優(yōu)勢,無論是性能、質(zhì)量還是價(jià)格都是企業(yè)搭建網(wǎng)站的首選平臺。

image
  • Linux 操作系統(tǒng)底層

  • Apache 服務(wù)器,屬于次級服務(wù)器,溝通Linux和php

  • PHP 服務(wù)端腳本語言,使用php_module模塊與Apache服務(wù)器關(guān)聯(lián),

  • Mysql 和 Web Aplication (其他web服務(wù)),使用php_extensions 模塊相關(guān)聯(lián)

二、Apache 生命周期

image
  • 啟動(dòng)階段:Apache解析配置文件(如http.conf以及Include指令設(shè)定的配置文件等),模塊加載(例如mod_php.so,mod_perl.so等)和系統(tǒng)資源初始化(例如日志文件、共享內(nèi)存段等)工作。在這個(gè)階段,Apache為了獲得系統(tǒng)資源最大的使用權(quán)限,將以特權(quán)用戶root(X系統(tǒng))或超級管理員administrator(Windows系統(tǒng))完成啟動(dòng)。

  • 運(yùn)行階段:在這個(gè)階段,Apache為了獲得系統(tǒng)資源最大的使用權(quán)限,將以特權(quán)用戶root(X系統(tǒng))或超級管理員administrator(Windows系統(tǒng))完成啟動(dòng)。分11個(gè)階段處理用戶的請求。

三、Apache 處理請求的過程

image
  • URI Translation階段:將請求的URL映射到本地文件系統(tǒng),mod_alias模塊就是在這個(gè)階段工作

  • Header Parsing階段:解析header頭部,mod_setenvif在這個(gè)階段工作

  • Access Control階段:按照配置文件設(shè)定的策略對用戶進(jìn)行認(rèn)證,并設(shè)定用戶名區(qū)域,模塊可以在這階段實(shí)現(xiàn)認(rèn)證方法。

  • Authorization階段:根據(jù)配置文件檢查是否允許認(rèn)證過的用戶執(zhí)行請求的操作,模塊可以在這階段實(shí)現(xiàn)用戶權(quán)限管理的方法

  • MIME Type Checking階段 :根據(jù)請求資源的MIME類型的相關(guān)規(guī)則,將文件交由相應(yīng)的處理模塊。

  • Fix Up 階段:模塊在內(nèi)容生成器之前,運(yùn)行必要的處理流程

  • Response階段 :生成響應(yīng)報(bào)文。

  • Logging階段 :在響應(yīng)客戶端后記錄事務(wù)

  • CleanUp階段 :清除請求后遺留的環(huán)境,如文件、目錄的處理或者Socket的關(guān)閉等。

四、Apache 的兩種工作模式

1.什么是MPM

MPM(Multi-Processing Modules,多路處理模塊)是Apache的核心組件之一,Apache通過MPM來使用操作系統(tǒng)的資源,對進(jìn)程和線程池進(jìn)行管理。Apache為了能夠獲得更好的運(yùn)行性能,針對不同的平臺 (Unix/Linux、Window)提供了不同的MPM,用戶可以根據(jù)實(shí)際情況進(jìn)行選擇,其中最常使用的MPM有 prefork和worker兩種。

2.Prefork

  • 工作原理:Prefork是非線程、預(yù)生成進(jìn)程型MPM,會預(yù)先啟動(dòng)一些子進(jìn)程,每個(gè)子進(jìn)程一個(gè)時(shí)間只能處理一個(gè)請求,并且會根據(jù)并發(fā)請求數(shù)量動(dòng)態(tài)生成更多子進(jìn)程

  • 配置參數(shù):

    StartServices    服務(wù)器啟動(dòng)默認(rèn)啟動(dòng)的子進(jìn)程;
    
    MinSpareServers    最小空閑進(jìn)程數(shù)量;
    
    MaxSpareServers    最大空閑進(jìn)程數(shù)量;
    
    MaxClients     最高的并發(fā)量;
    
    ServerLimit    最大限制的并發(fā)量;
    
    MaxRequestsPerChild      每個(gè)子進(jìn)程默認(rèn)最多處理多少個(gè)請求。當(dāng)達(dá)到設(shè)定值時(shí),這個(gè)進(jìn)程就會被kill掉,重新生成一個(gè)新的進(jìn)程(避免內(nèi)存泄露等安全性問題,運(yùn)行太久怕出一些bug,可能出現(xiàn)假死,或者占用太多內(nèi)存等);
    

    3.worker

  • Workder是線程化、多進(jìn)程的MPM,每個(gè)進(jìn)程可以生成多個(gè)線程,每個(gè)線程處理一個(gè)請求;不需要啟用太多的子進(jìn)程,每個(gè)進(jìn)程能夠擁有的線程數(shù)量是固定的。服務(wù)器會根據(jù)負(fù)載情況增加或減少進(jìn)程數(shù)量。一個(gè)單獨(dú)的控制進(jìn)程(父進(jìn)程)負(fù)責(zé)子進(jìn)程的建立。每個(gè)子進(jìn)程能夠建立ThreadsPerChild數(shù)量的服務(wù)線程和一個(gè)監(jiān)聽線程,該監(jiān)聽線程監(jiān)聽接入請求并將其傳遞給服務(wù)線程處理和應(yīng)答。

  • 配置參數(shù):

    StartServers 服務(wù)器啟動(dòng)時(shí)建立的子進(jìn)程數(shù),默認(rèn)值是"3"。
    
    MaxClients  允許同時(shí)服務(wù)的最大接入請求數(shù)量(最大線程數(shù)量)。任何超過MaxClients限制的請求都將進(jìn)入等候隊(duì)列,默認(rèn)值是"400"。
    
    MinSpareThreads 最小空閑線程數(shù),默認(rèn)值是"75"。
    
    MaxSpareThreads  設(shè)置最大空閑線程數(shù)。默認(rèn)值是"250"。
    
    ThreadsPerChild  每個(gè)子進(jìn)程建立的常駐的執(zhí)行線程數(shù)。默認(rèn)值是25
    
    MaxRequestsPerChild  設(shè)置每個(gè)子進(jìn)程在其生存期內(nèi)允許處理的最大請求數(shù)量。
    
    

4.Prefork和Worker的比較

  1. prefork方式速度要稍高于worker,然而它需要的cpu和memory資源也稍多于woker。

  2. prefork的無線程設(shè)計(jì)在某些情況下將比worker更有優(yōu)勢:它可以使用那些沒有處理好線程安全的第三方模塊,并且對于那些線程調(diào)試?yán)щy的平臺而言,它也更容易調(diào)試一些。

  3. 在一個(gè)高流量的HTTP服務(wù)器上,Worker MPM是個(gè)比較好的選擇,因?yàn)閃orker MPM的內(nèi)存使用比Prefork MPM要低得多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容