Apache工作原理

Apache工作原理

前言

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

1. LAMP架構

  • 說起apache,那就不得不瞭解一下LAMP架構,LAMP架構是較爲流行的一套建站架構,因其通用、跨平臺、高性能、低價格的優勢,無論是性能、質量還是價格都是企業搭建網站的首選平臺。

在這裏插入圖片描述

  • Linux 操作系統底層
  • Apache 服務器,屬於次級服務器,溝通Linux和php
  • PHP 服務端腳本語言,使用php_module模塊與Apache服務器關聯,
  • Mysql 和 Web Aplication (其他web服務),使用php_extensions 模塊相關聯

2. Apache的生命週期

在這裏插入圖片描述

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

  • 運行階段:在這個階段,Apache爲了獲得系統資源最大的使用權限,將以特權用戶root(X系統)或超級管理員administrator(Windows系統)完成啓動。分11個階段處理用戶的請求。

3. Apache處理請求的過程

在這裏插入圖片描述

  • URI Translation階段:將請求的URL映射到本地文件系統,mod_alias模塊就是在這個階段工作
  • Header Parsing階段:解析header頭部,mod_setenvif在這個階段工作
  • Access Control階段:按照配置文件設定的策略對用戶進行認證,並設定用戶名區域,模塊可以在這階段實現認證方法。
  • Authorization階段:根據配置文件檢查是否允許認證過的用戶執行請求的操作,模塊可以在這階段實現用戶權限管理的方法
  • MIME Type Checking階段 :根據請求資源的MIME類型的相關規則,將文件交由相應的處理模塊。
  • Fix Up 階段:模塊在內容生成器之前,運行必要的處理流程
  • Response階段 :生成響應報文。
  • Logging階段 :在響應客戶端後記錄事務
  • CleanUp階段 :清除請求後遺留的環境,如文件、目錄的處理或者Socket的關閉等。

4. Apache的兩種工作模式

4.1 什麼是MPM

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

4.2 prefork

  • 工作原理:Prefork是非線程、預生成進程型MPM,會預先啓動一些子進程,每個子進程一個時間只能處理一個請求,並且會根據併發請求數量動態生成更多子進程
  • 配置參數:
StartServices    服務器啓動默認啓動的子進程;

MinSpareServers    最小空閒進程數量;

MaxSpareServers    最大空閒進程數量;

MaxClients     最高的併發量;

ServerLimit    最大限制的併發量;

MaxRequestsPerChild      每個子進程默認最多處理多少個請求。當達到設定值時,這個進程就會被kill掉,重新生成一個新的進程(避免內存泄露等安全性問題,運行太久怕出一些bug,可能出現假死,或者佔用太多內存等);

4.3 worker

  • Workder是線程化、多進程的MPM,每個進程可以生成多個線程,每個線程處理一個請求;不需要啓用太多的子進程,每個進程能夠擁有的線程數量是固定的。服務器會根據負載情況增加或減少進程數量。一個單獨的控制進程(父進程)負責子進程的建立。每個子進程能夠建立ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。
  • 配置參數:
StartServers 服務器啓動時建立的子進程數,默認值是"3"。

MaxClients  允許同時服務的最大接入請求數量(最大線程數量)。任何超過MaxClients限制的請求都將進入等候隊列,默認值是"400"。

MinSpareThreads 最小空閒線程數,默認值是"75"。

MaxSpareThreads  設置最大空閒線程數。默認值是"250"。

ThreadsPerChild  每個子進程建立的常駐的執行線程數。默認值是25

MaxRequestsPerChild  設置每個子進程在其生存期內允許處理的最大請求數量。

4.4 prefork和worker的比較

  • prefork方式速度要稍高於worker,然而它需要的cpu和memory資源也稍多於woker。
  • prefork的無線程設計在某些情況下將比worker更有優勢:它可以使用那些沒有處理好線程安全的第三方模塊,並且對於那些線程調試困難的平臺而言,它也更容易調試一些。
  • 在一個高流量的HTTP服務器上,Worker MPM是個比較好的選擇,因爲Worker MPM的內存使用比Prefork MPM要低得多。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章