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工做原理