Apache 体系结构以及工作原理

  • 内容
  • 相关
Apache采用模块化的体系结构,它的大部分功能都被分割成相互独立的模块,这样的结构可以通过增加和删除模块就可以扩展和修改Apache提供的功能,另一方面,对于Apache 功能的理解也变得非常容易。

1. Apache的目录结构 (httpd2.0为例)

httpd源代码文件有2000个,包括180多个目录

----server :此目录是整个Apache核心功能实现,包括请求处理、协议处理等,此目录下面还包括多线程处理模块(mpm),主要是用来实现多线程并发的。

----modules:包括Apache所有的模块,而且一个模块占用一个目录  mod_ssl  mod_proxy mod_perl

----include:Apache必需的头文件,包括一些极其重要的头文件 http_main.h   http_protocol.h http_request.h 等

----os :操作系统平台依赖文件

----srclib:Apache开发和运行需要的基础库,主要包括 apr_util  apr 和 pcre

----support:用于辅助Apache的小工具 tools

----test:APR的测试函数

2. Apache 层次结构
Apache 可以分为5层,分别是 操作系统平台功能层,可移植运行库层(操作系统适配层),Apache核心功能层,Apache可选功能层和Apache第三方功能库。

(1) 操作系统平台功能层:

Apache实质上还是运行在操作系统上面的应用程序,因此必须使用操作系统本身提供的底层功能,比如进程和线程、进程和线程的通信,网络套接字通信和文件操作等

同事Apache也是跨平台(可以在不同的操作系统上运行)

(2) 可移植运行库(APR)

APR(Apache portable runtime) 是操作系统的适配层,通过APR也实现了Apache的跨平台。因为不同的操作系统提供的底层API不同,也就是实现同一个操作所用的函数方法不同,这时在Apache和操作系统中间设计一个APR,这样APR根据不同的操作系统分别实现一个相同的功能,这样apache可以调用APR的提供的一个API接口。

(3) 核心功能层

a) 核心功能层主要实现Apache的基本功能和核心功能,包括读取和响应HTTP请求,处理HTTP协议;核心功能层包括核心程序和核心模块

核心程序主要是实现Apache的基本功能:

  • 启动和终止apache
  • 处理配置文件(config.c)
  • 接受和处理HTTP连接
  • 读取HTTP请求并对该请求进行处理
  • 处理HTTP协议

核心功能层另一个是 核心模块,apache的大部分模块是可选择的,可以有也可以没有,但是有两个模块是必须的,即:mod_core和 mod_so

mod_core:负责处理配置文件中的大部分配置指令,并根据这些指令运行apache

mod_so:负责在需要的时候动态加载其余模块,缺少了该模块其他模块无法加载

多进程并发处理模块MPM(这里理解一个client请求成功并建立一个TCP连接,则这是一个进程),MPM虽然hi可以选择的,但是现在apache必须要用到多进程并发,所以这个模块也是必须的模块

 b) Apache 最基本的核心功能由apache 核心完成,除此之外,核心无法提供的功能则全部由模块提供。为了允许这些模块能完成控制apache的处理,apache核心程序提供了对应的API;这些API是指每个模块中包含的一系列的函数(核心程序处理HTTP请求的时候用来将信息传递给模块),以及一些列apr的函数。

(4) 可选功能层

Apache有很多模块,包括mod_ssl mod_proxy mod_perl ;apache的文件都是C语言开发的,如果有perl脚本写的模块,必须把mod_perl 模块加载,否则不能运行

(5) 第三方支持库

apahe的一些模块会使用到第三方的开发库,比如 mod_ssl 使用了 openssl;mod_perl 使用了perl 开发库,这些库并不属于apache,是第三方库。
 

3. Apache运行流程

(1) Apache启动过程

 apache的启动包括两个阶段,高权限启动阶段和低权限运行阶段,通常称之为两阶段启动方式。

apache中的绝大部分内存都是基于内存池分配的,在apache启动时必须首先初始化内存池资源;然后apache会读取和解析apache的配置文件(httpd.conf) ;在启动的最后阶段,apache将通过调用ap_mpm_run函数并将控制权交给MPM,只有当MPM执行失败或结束后才把控制权交还给主程序,而且MPM在处理HTTP连接时用的权限是普通用户的权限,这样会避免黑客攻击apache会获取root权限。

MPM有两种并发方式:prefork  worker,其中 prefork是以进程为基本单位,每一个请求可能会产生多个进程,这样如果在window系统中,一个进程占的资源比较大,这样apache负载的并发就比较小;所以在Linux系统中是prefork模式,在window系统中一般采用 worker模式。

apache工作原理


DSO是Dynamic Shared Objects(动态共享目标)的缩写,它是现代Unix派生出来的操作系统都存在着的一种动态连接机制。它提供了一种在运行时将特殊格式的代码,在程序 运行需要时,将需要的部分从外存调入内存执行的方法。Apache在1.3以后的版本后开始支持它。因为Apache早就使用一个模块概念来扩展它的功能 并且在内部使用一个基于调度的列表来链接扩展模块到Apache核心模块.所以,Apache早就注定要使用DSO来在运行时加载它的模块。

让我们先来看一下Apache本身的程序结构:这是一个很复杂的四层结构--每一层构建在下一层之上。

第四层是用Apache模块开发的第三方库--比如open ssl一般来说在Apache的官方发行版中这层是空的,但是在实际的Apache结构中这些库构成的层结构肯定是存在的。

第三层是一些可选的附加功能模块--如mod_ssl,mod_perl。这一层的每个模块通常实现的是Apache的一个独立的分离的功能而事实上这些模块没有一个是必须的,运行一个最小的Apache不需要任何一个此层的模块。

第二层是Apache的基本功能库-这也是Apache的核心本质层--这层包括Apache内核,http_core(Apache的核心模 块),它们实现了基本HTTP功能(比如资源处理(通过文件描述符和内存段等等),保持预生成(pre-forked)子进程模型,监听已配置的虚拟服务 器的TCP/IP套接字,传输HTTP请求流到处理进程,处理HTTP协议状态,读写缓冲,此外还有附加的许多功能比如URL和MIME头的解析及DSO 的装载等),也提供了Apache的应用程序接口(API)(其实Apache的真正功能还是包含在内部模块中的,为了允许这些模块完全控制Apache 进程,内核必须提供API接口),这层也包括了一般性的可用代码库(libap)和实现正则表达式匹配的库(libregex)还有就是一个小的操作系统 的抽象库(libos)。

最低层是与OS相关的平台性应用函数,这些OS可以是不同现代UNIX的变种,win32,os/2,MacOS甚至只要是一个POSIX子系统。

本文标签:

版权声明:若无特殊注明,本文皆为《筱彬》原创,转载请保留文章出处。

本文链接:Apache 体系结构以及工作原理 - http://www.itfml.com/fuwuqi/11.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

评论

2条评论
  1. avatar

    明月学习笔记 Lv.1 Chrome 57.0.2987.133 Chrome 57.0.2987.133 Windows Windows 回复

    最近一直在研究LNMP,对Nginx有点儿情有独钟了!

    河南省南阳市 电信

    1. 筱彬 Firefox 53.0 Firefox 53.0 Windows 7 x64 Edition Windows 7 x64 Edition 回复

      回复了明月学习笔记:lnmp非常好!!

      北京市朝阳区 联通