当前位置:文档之家› apache模块化体系结构简析

apache模块化体系结构简析

apache模块化体系结构简析目录APACHE勺体系结构概述 (1)APACH核心功能层 (3)APACH核心组件 (4)APACH核心处理框架 (4)APACH可选功能层(模块) (5)挂钩(HOOK (6)预定义标准挂钩 (6)挂钩使用 (6)挂钩声明 (6)挂钩数组声明 (7)挂钩结构 (7)挂钩注册 (8)挂钩使用 (8)APACHE 2.0系列的模块结构 (9)模块与核心的交互 (11)APACHE勺体系结构概述APACH采用了分层与模块化的体系结构,如图1所示。

图1 Apache分层与模块化体系结构加上操作系统层,整个 Apache 可以被分隔为五层,各层次的功能如下:(1) 操作系统支持层,操作系统本身提供的底层功能,比如进程和线程、进程和线程 间的通信、网络套接字通信、文件操作等。

(2) 可移植运行库层,不同的操作系统提供的底层 API 存在着很大的差异。

对于Apache 设计者而言,除了考虑WW 和服务器功能的实现之外,还必须考虑不同操作系统的 API 细节 问题。

显然,合理的做法就是将不同操作系统的底层细节封装起来形成操作系统API 的适配 并将其隐藏起来。

从Apache 2.0开始,Apache 就将专门封装不同操作系统API 的任务独立出来形成一个 新的项目 APR 全称为 Apache 可移植运行库(Apache Portable Runtime ,APR 。

APR 的任 务就是屏蔽底层的操作系统 API 细节,对于所有的操作系统,提供一个完全相同的函数接口。

这样,Apache 开发者 就不必顾虑操作系统细节,而只要开发上层功能即可。

比如对于进程不同的操作系统提供的创建进程的API 是不同的,Unix 下通用的是fork() , Windows 下则是 CreateProcess() ,OS/2、Netware 及BeOS 中的API 也迥然不同。

APR 将所有的创建 细节封装起来,提供了统一的对外接口 apr_proc_create()。

这样,APR 的使用者如果要创建进程,则只须调用 apr proc create(),不管它将要运行于哪个操作系统平台。

APR 的独立带来的另一个潜在的益处就是它将最终形成一个独立的可移植运行库。

因此, pqi=-Jar puu实际上任何应用程序如果要考虑跨平台,都可以使用它作为底层的支持。

(3)核心功能层,包括两大部分:Apache核心程序和Apache核心模块。

Apache的核心程序主要用于实现Apache作为HTTP服务器的基本功能,这些基本功能包括:启动和停止Apache,处理配置文件(config.c ),接受和处理HTTP连接,读取HTTP 请求并对该请求进行处理,处理HTTP协议。

核心模块,Apache中大部分模块都是可选择的,这意味着对于Apache而言是可有可无的。

这些模块的缺失至多影响Apache功能的完整性,并不影响运行,比如mod_ssl、mod_alias等。

但是有两个模块则是必需的,即mod_core和mod_so。

前者负责处理配置文件中的大部分配置指令,并根据这些指令运行Apache,而后者则负责动态加载其余的模块,缺少了该模块,其余的模块就无法使用。

这两个模块都必须静态编译。

对于Apache而言,另外一个重要的模块就是MPM即多进程处理模块。

尽管MPM也是属于可选择的,但是它通常负责处理Apache中的并发模型,或者是Prefork,或者是线程池(ThreadPool),或者是Worker模型等。

大多数情况下,它们总是会被加载,因此我们也将其视为核心的模块。

Apache核心(第三层)主要有以下两个作用。

基本的HTTP服务功能,Apache核心必须提供最基本的资源处理,或者通过文件描述符,或者通过内存段等来提供;维护多进程运行模型;在配置好的虚拟主机上侦听TCP/IP套接字;将接收到的客户端请求传递给特定的处理进程,处理HTTP协议状态,提供基本的读入和写入缓冲区等。

另外,核心部分还提供一些通用的功能,比如URL及MIME头部解析,DSO模块加载等。

Apache Module API ,Apache最基本的核心功能由Apache核心完成,除此之外,核心无法提供的功能则全部由模块提供。

为了允许这些模块能够完全控制Apache的处理,Apache核心必须提供对应的API。

在Apache中,这些API是指每个模块中包含一系列的函数(核心在处理HTTP请求的时候用来将消息传递给模块),以及一系列的以"apr"开始的函数。

(4)可选功能层,可选功能层通常指Apache模块。

按需载入,比如,如果需要Apache 服务器支持安全套接字层(Secure Socket Layer , SSL),那么毫无疑问,我们必须将mod_ssl 模块加载到核心中。

目前,Apache中的模块很多,Apache能够支持的完整的注册过的模块信息可以在 上查看。

(5)第三方支持库,在Apache的一些模块中会使用到第三方的开发库,比如mod_ssl 就使用了OpenSSLmod_perl则使用了Perl开发库。

这些第三方支持库虽然被Apache使用,但严格来说它们并不属于Apache的一部分。

APACHE体系结构的模块化特点主要体现在第三层(核心功能层)与第四层(可选功能层),Apache采用的模块化的体系结构,使它作为一个HTTP服务器的大部分功能都被分割为相互独立的模块,这样,通过增加或删除模块就可以扩展和修改Apache提供的功能。

APACHE核心功能层APACHES心功能层实现了APAPCH作为一个HTTP服务器应具备的基本功能,包括:启动和停止Apache,处理配置文件,接受和处理HTTP连接,读取HTTP请求并对该请求进行处理,处理HTTP协议等。

APACHE核心组件从实现这些基本功能的源代码来看,Apache的核心功能层可以有以下的几个组件组成:配置文件组件(HTTP_CONFI)进程并发处理组件(MPM,连接处理组件(HTTP_CONNECTION HTTP协议处理组件(HTTP_PROTOC)L HTTP请求处理组件(HTTP_REQUE$T HTTP核心组件(HTTP_CORE核心模块组件(MOD_CORE HTTP配置文件组件(HTTP_CONF)。

(1)HTTP_CONFI组件主要位于http_config.h 和config.c 中,对配置文件进行解析、处理和保存。

另外,HTTP_CONFI(组件还必须提供对配置数据访问的接口,其余组件在配置数据的任何时候都能够快地返回配置信息。

(2)进程并发处理组件(MPM,MPM!件主要位于mpm i录下的各个文件中,比如Prefork MPM 寸应的就是prefork.c 。

MPM负责为Apache系统提供可靠、稳定、高效的进程和线程的并发处理。

任何时候,Apache中只能有一个MPM在运行,而且MPM、须在编译的时候指定,不允许动态加载。

(3 ) HTTP 连接处理组件( HTTP_CONNECTION HTTP_CONNECTIO组件主要位于http_connection.h 和connection.c 中。

该组件主要负责处理与HTTP连接相关的事情。

(4)HTTP协议处理组件(HTTP_PROTOC)L 在Apache 2.x 系列中,HTTP_PROTOCOL组件主要位于http_protocol.h 和http_protocol.c 中,主要负责处理HTTP/1.0 及HTTP/1.1协议的解析,比如解析http请求头、生成返回给客户端的响应包等。

所有与协议相关的处理都由该组件完成。

(5)HTTP请求处理组件(HTTP_REQUE$THTTP_REQUES!件主要位于http_request.h 、http_request.c 及request.c 三个文件中。

与Apache 1.3 相比,它增加了request.c 文件。

与请求相关的函数全部定义在http_request.h 中,函数实现则分散在两个.c中。

(6)HTTP核心组件(HTTP_CORE,在APACHE2.X系列中,还增加了一个HTTP_CORE 模块,它位于文件http_core.h 和http_core.c 中,该组件主要是将与HTTP协议相关的内容从原来的核心模块中提取出来的。

最早的时候,一些与HTTP协议相关的指令(如KeekpAliveTimeout、、MaxKeepAliveRequests 及KeepAlive )都是直接有core.c 核心模块完成的,这样导致核心模块与HTTP协议的耦合度过高,而APACHE勺设计者想要把APACHE设计为一个通用的服务器,而不仅仅是一个Web服务器。

(7)核心模块组件(MOD_CORE核心模块(MOD_CORE由mod_core.h和core.c 组成,该模块的主要任务就是对核心需要的指令进行比较,比如<Directory> 、<Location>、DocumentRoot等。

该模块在HTTP_CONFl(中被调用。

APACHE核心处理框架最终,APACHE的核心功能层构造了HTTP服务器的基本功能的一个处理框架(流程) ,如图3所示。

图3 APACHE核心处理框架这个框架包含了APAPCH对一个HTTP青求的不同的处理阶段。

模块扩展APACHE勺功能的实现是通过APACHES供的一种机制:允许模块针对特定的HTTP请求,在这个框架里的已有的一些阶段中增加一些额外的处理;允许模块增加新的处理阶段。

APACH可选功能层(模块)APACHES心层构造了一个基本的处理框架,并且为这个框架的各个分支(即HTTP请求处理的各个阶段)提供了默认的实现,从而实现了APACHES为一个HTTP服务器应具有的最基本的功能。

也就是说,如果只有核心层的话,APACHE寸一次HTTP的请求只做默认的处理,例如:在这个处理框架的内容生成阶段,APACHES是简单的将服务器上的文件(不管是html 还是PHFP直接返回个客户端,不做额外处理。

这显然不是我们想要的,应该是根据文件类型的不同做不同的处理之后再返回给客户端。

APACHES心层通过一种机制(接口)让他构造的处理框架及其各个分支是可以扩展的:可以增加额外的分支;可以在分支上增加额外的处理或者直接替代默认的处理行为。

APACHE模块就是通过这个接口要么增加新的分支(如日志模块),要么为新的分支增加额外的处理(如PHP模块为内容生成分支增加了对php文件进行处理的功能)。

挂钩(HOO K之前,我们反复提到APACHES心层提供了一种机制,这种机制使得APACHE S块能够扩展核心层的功能。

相关主题