2.4 Apache运行流程
在本节中我们将概要描述Apache的整个运行流程。Apache的运行流程可以细分为三个大的阶段。
Apache启动过程,如图2-7中的A部分所示。
图2-7 Apache执行流程 |
接受客户端连接,并处理该连接,如图2-7中的B部分所示。
从连接中读取请求数据,处理客户端的一次请求,如图2-7中的C部分所示。
整个运行流程可以使用图2-7进行描述。
2.4.1 Apache启动过程
Apache的启动包括两个阶段:高权限启动阶段和低权限运行阶段,通常称之为两阶段启动方式。Apache总是以root用户身份启动运行,因此启动Apache时首先必须获得root权限。在启动的过程中,初始化的工作包括以下几个方面。
1. 初始化系统所需要的资源
由于Apache中绝大多数的内存都是基于内存池分配的,因此,在Apache启动的时候必须首先初始化内存池资源。另外,初始化的一个主要任务就是对配置文件进行读取和解析。在启动的过程中,配置文件会被读取两次。第一次读取称之为预读取,主要是从配置文件中获得第二次配置文件中需要的一些配置信息;基于第一次读取的结果,第二次才是真正的配置文件读取。
根据配置文件的解析结构,启动过程还会对虚拟主机进行相关的初始化准备工作。如果要连接数据库,我们还需要初始化数据库连接。
在启动的最后阶段,Apache将通过调用ap_mpm_run函数将控制权交给MPM模块。只有MPM模块执行失败或执行完毕的时候,执行权才会从MPM返回到主程序中。MPM是Apache服务器和操作系统之间的接口,它的目的只有一个,就是充分利用操作系统的特性,对服务器的并发效率进行最大的优化。
在早期的Apache 1.3版本中,仅有prefork模型被支持,这种模型以进程作为基本的执行单位。显然,在其余的操作系统中,比如Windows中,进程是个重量级的家伙,如果以进程为执行单元,那么服务器的负载会变得极其有限。事实上,由于各种操作系统本身特性的限制,不存在一种能"走遍天下"的适用于所有操作系统的并发模型。Apache将这些并发模型作为Apache的模块,这样,在特定的操作系统上,为了达到更高的并发效率,只要使用与之对应的MPM模块即可。
一旦权限从Apache主程序交给MPM,MPM将生成一定数目的进程或线程,侦听指定的端口,并等待接受客户端的连接。一旦接收到客户端请求,Apache将进入连接和请求处理阶段。Apache在接受和处理来自客户端的连接时,会以普通用户的权限去处理,而不会采用系统级别的权限。这种基本的安全策略可以防止Apache(或模块或脚本程序)遭到损害和变得脆弱。一旦黑客攻克了Apache服务器,那么此时它能够获得的权限也仅仅是Apache正在运行的普通用户权限,而不是超级用户权限。这样可以确保服务器的安全。