title: 淺析 Apache 工做原理
date: 2017-04-01 23:32:29
categories:
tags: ["Apache","web服務器"]
---
Apache是目前世界上使用最爲普遍的一種Web Server,它以跨平臺、高效和穩定而聞名。那麼Apache是怎樣工做的呢?php
提及apache,那就不得不瞭解一下LAMP架構,LAMP架構是較爲流行的一套建站架構,因其通用、跨平臺、高性能、低價格的優點,不管是性能、質量仍是價格都是企業搭建網站的首選平臺。git
Linux 操做系統底層github
Apache 服務器,屬於次級服務器,溝通Linux和phpweb
PHP 服務端腳本語言,使用php_module模塊與Apache服務器關聯,sql
Mysql 和 Web Aplication (其餘web服務),使用php_extensions 模塊相關聯apache
啓動階段:Apache解析配置文件(如http.conf以及Include指令設定的配置文件等),模塊加載(例如mod_php.so,mod_perl.so等)和系統資源初始化(例如日誌文件、共享內存段等)工做。在這個階段,Apache爲了得到系統資源最大的使用權限,將以特權用戶root(X系統)或超級管理員administrator(Windows系統)完成啓動。安全
運行階段:在這個階段,Apache爲了得到系統資源最大的使用權限,將以特權用戶root(X系統)或超級管理員administrator(Windows系統)完成啓動。分11個階段處理用戶的請求。服務器
URI Translation階段:將請求的URL映射到本地文件系統,mod_alias模塊就是在這個階段工做架構
Header Parsing階段:解析header頭部,mod_setenvif在這個階段工做併發
Access Control階段:按照配置文件設定的策略對用戶進行認證,並設定用戶名區域,模塊能夠在這階段實現認證方法。
Authorization階段:根據配置文件檢查是否容許認證過的用戶執行請求的操做,模塊能夠在這階段實現用戶權限管理的方法
MIME Type Checking階段 :根據請求資源的MIME類型的相關規則,將文件交由相應的處理模塊。
Fix Up 階段:模塊在內容生成器以前,運行必要的處理流程
Response階段 :生成響應報文。
Logging階段 :在響應客戶端後記錄事務
CleanUp階段 :清除請求後遺留的環境,如文件、目錄的處理或者Socket的關閉等。
MPM(Multi-Processing Modules,多路處理模塊)是Apache的核心組件之一,Apache經過MPM來使用操做系統的資源,對進程和線程池進行管理。Apache爲了可以得到更好的運行性能,針對不一樣的平臺 (Unix/Linux、Window)提供了不一樣的MPM,用戶能夠根據實際狀況進行選擇,其中最常使用的MPM有 prefork和worker兩種。
配置參數:
StartServices 服務器啓動默認啓動的子進程; MinSpareServers 最小空閒進程數量; MaxSpareServers 最大空閒進程數量; MaxClients 最高的併發量; ServerLimit 最大限制的併發量; MaxRequestsPerChild 每一個子進程默認最多處理多少個請求。當達到設定值時,這個進程就會被kill掉,從新生成一個新的進程(避免內存泄露等安全性問題,運行過久怕出一些bug,可能出現假死,或者佔用太多內存等);
Workder是線程化、多進程的MPM,每一個進程能夠生成多個線程,每一個線程處理一個請求;不須要啓用太多的子進程,每一個進程可以擁有的線程數量是固定的。服務器會根據負載狀況增長或減小進程數量。一個單獨的控制進程(父進程)負責子進程的創建。每一個子進程可以創建ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。
配置參數:
StartServers 服務器啓動時創建的子進程數,默認值是"3"。 MaxClients 容許同時服務的最大接入請求數量(最大線程數量)。任何超過MaxClients限制的請求都將進入等候隊列,默認值是"400"。 MinSpareThreads 最小空閒線程數,默認值是"75"。 MaxSpareThreads 設置最大空閒線程數。默認值是"250"。 ThreadsPerChild 每一個子進程創建的常駐的執行線程數。默認值是25 MaxRequestsPerChild 設置每一個子進程在其生存期內容許處理的最大請求數量。
prefork方式速度要稍高於worker,然而它須要的cpu和memory資源也稍多於woker。
prefork的無線程設計在某些狀況下將比worker更有優點:它可使用那些沒有處理好線程安全的第三方模塊,而且對於那些線程調試困難的平臺而言,它也更容易調試一些。
在一個高流量的HTTP服務器上,Worker MPM是個比較好的選擇,由於Worker MPM的內存使用比Prefork MPM要低得多。
博客始發於本人我的博客:淺析apache工做原理