您好,欢迎访问三七文档
Apache模块开发指南 Apache 平台和架构 The Apache Platform and Architecture Apache作为常驻的后台任务运行:在UNIX 系统中为守候进程(Daemon),在Windows 系统中为服务(Service)。由于 Apache 服务器的启动阶段比较耗费时间和资源,因此它一般在操作系统启动时被启动并一直运行。Apache的早期版本曾支持inetd模式 1 ,但是该模式已经不再适合实际的应用。 2.1 纵览 Apache的 HTTP 服务器由一个相对较小的内核及一些模块组成,如图2.1所示。模块可以静态的编译到服务器中,但是通常都把模块放在/Modules/目录或者/libexec/目录下面,服务器运行时这些模块被动态加载。另外,Apache 服务器依赖底层的可移植运行 1 译注:inetd表示Web服务不是以一个单独的守候进程的形式支持,而是由inetd这个超级服务器守候进程进行代劳的,当它收到一个客户端的Web服务请求的时候,再启动一个Web 服务进程为其服务,服务器进程在它结束对请求服务的同时立刻退出。CHAPTER第2章第2章Apache平台和架构Apache模块开发指南 22 时库(Apache Portable Runtime,APR)。可移植运行时库提供跨平台的操作系统抽象层和功能函数,为上层模块提供统一的接口,这样模块可以避免受到不可移植的操作系统调用的影响。多处理模块(MultiProcessing Module,MPM)是一个特殊的功能模块,用来根据底层的操作系统来优化 Apache。多处理模块通常是唯一直接访问操作系统的模块,其他模块可以通过可移植运行时库来访问操作系统。图2.1 Apache架构 2.2 Apache运行的两个阶段 Apache的运行分为启动阶段和运行阶段。启动阶段时,Apache以特权用户 root 启动,进行解析配置文件、加载模块和初始化一些系统资源(例如日志文件、共享内存段、数据库连接)等操作。处于运行阶段时,Apache 放弃特权用户级别,使用非特权用户来接收和处理网络中用户的服务请求。这种基本安全机制可以阻止 Apache 中由于一个简单软件错误(也可能是模块或脚本)而导致的严重系统安全漏洞,例如微软的 IIS 就曾遭受“红色代码(Code Red)”和“尼姆达(Nimda)”等恶意代码的溢出攻击。 Apache 的这种两个阶段的运行方式对应用程序的架构具有一定影响。首先,任何需要系统级权限的操作都必须在系统启动时运行。其次,最好在启动阶段进行尽可能多的初2.2Apache运行的两个阶段Apache模块开发指南 23 始化工作来简化处理每个请求时的工作量。这样做带来的影响就是:由于耗费很多时间和资源的操作都集中在启动阶段完成,因此 Apache以inetd或tcpserver模式运行时效率就会非常低。 Apache 的架构有一个不符合常规的古怪之处:配置代码实际上在启动阶段执行了两次(尽管不是重新启动)。第一次,检查服务器配置是否正确(至少,Apache 能够成功启动);第二次是真正的系统启动,然后引导至运行阶段。这种启动执行两次的行为大多数模块都能忽略(如 APR 池能够保证不会引起资源的泄漏),但是,对某些模块还是有影响的。例如,某些模块在系统启动阶段动态加载新的代码,如果想要这些代码只加载一次,那么就需要采用某些技巧(例如采用检查全局标志位的方法)来保证加载操作只做了一次。 2.2.1 启动阶段 Apache 在启动阶段读取配置文件、加载模块和函数库,以及分配资源。每个模块可能都需要资源,并在启动阶段对这些资源进行初始化。Apache 在启动阶段拥有系统最高权限,以单进程、单线程方式运行。 2.2.1.1 配置 Apache的主配置文件通常为httpd.conf。但是由于这种命名方式为一般惯例,并非强制要求,因此提供.rpm或者.deb包的第三方,Apache发行版本可能使用不同的命名机制。另外,httpd.conf文件可能是单一文件,也可能是通过使用Include指令包含不同配置文件的多个文件集合。有些发行版本的配置非常复杂。例如 Debian GNU/Linux 的 Apache配置需要对Debian非常熟悉而不是Apache。本书并不探讨不同配置设计的优缺点,因此,为了简化,我们认为配置文件为httpd.conf。httpd.conf文件是一个文本文件,在系统启动时被逐行解析。该文件由指令、容器和注释组成。配置文件内允许有空行和空格,它们在解析时被忽略不计。第2章Apache平台和架构Apache模块开发指南 24 指令(Directives)httpd.conf文件中大多数内容是指令。指令可以没有参数,也可以有多个参数,参数之间用空格隔开。每一个指令有自己的语法格式,不同的指令允许不同的参数个数和参数类型(有字符串、数字、枚举、布尔或文件名等)。指令是在内核或者一些模块中实现的,我们将在第 9章中介绍。以下是几个指令的实例。LoadModule foo_module modules/mod_foo.so这个指令由mod_so模块实现,用来加载一个模块。第一个参数是模块名(字符与数字组成的字符串),第二个参数是文件名,可以是服务器根目录的绝对路径或者相对路径。DocumentRoot /usr/local/Apache/htdocs这个指令由内核实现的,用来设置网页所在主文档树的根目录。SetEnv hello “Hello, World!”这个指令由mod_env模块实现,用设置环境变量。注意,由于第二个参数包含空格,我们必须用双引号把它包含起来。Choices On这个指令由mod_choices(将在第6 章介绍)实现,用来激活模块的选项。容器(Containers)容器是一系列指令的集合,语法和标记语言很相像,使用尖括号进行归类。容器在语义上和其他指令不同,具有一个开始和结束的分隔行,在分隔行之间的指令为容器内部的指令。例如由内核模块中的VirtualHost容器如下所示,该容器定义了一个虚拟主机。VirtualHost 10.31.2.139 ServerName DocumentRoot /usr/ ServerAdmin Webmaster@example.com CustomLog /var/log/ /VirtualHost2.2Apache运行的两个阶段Apache模块开发指南 25 容器为里面的指令提供了上下文。在上面这个例子中,指令只对访问的请求进行响应。容器可以被嵌套使用,除非某个模块显式地声明容器不能嵌套。所有用到的指令,包括容器,都可能是上下文相关的,因此它们在某些具体的上下文中才有效。注释(Comments)如果一行语句以#号开头,那么该行被认为是注释语句。例如下面的语句为注释。# this line is a comment行中的#一般不会被认为是注释,除非模块明确地在实现该指令时支持行中注释。如果模块没有被加载,那么该模块所实现的指令就不能被识别。遇到这种情况时, Apache执行停止并返回一个语法错误。因此mod_so模块必须用静态的方式进行链接来加载其他模块。这一点非常重要!当你开发新的模块时没有静态地链接mod.so,那么每次在修正该模块时必须重新编译整个服务器程序。 2.2.2 运行阶段在启动阶段末期,程序的控制转向多处理模块MPM(见 2.3 节)。MPM 模块在系统级管理 Apache 的运行。它根据操作系统和应用的约束(如一些特殊场景的应用)维护进程池和/或线程池。MPM 的进程作为控制者,管理一系列子工作进程。子工作进程用来处理接入请求,而控制者进程负责创建和删除子工作进程,以及处理信号量(如停止或者重启)。MPM 的架构导致不可能在有限的的范围内描述运行阶段。尽管标准的 MPM 采用工作子进程的方式,但是 MPM 并没有被限制只能使用这一种方式。理论上 MPM 可以在系统层上实现其他完全不同的服务器架构。第2章Apache平台和架构Apache模块开发指南 26 2.2.3 停止阶段虽然没有明确的停止阶段,但是需要在服务停止的时候完成的工作应被注册为清除操作(在第 3章中介绍)。当Apache停止的时候,所有注册的清除操作都将运行。 2.3 多处理模块MPM 在启动阶段的末期,当所有的配置信息被读取之后,Apache 的控制转到多处理模块 MPM。MPM 提供 Apache 服务程序和其所在的操作系统之间的接口。该模块的主要职责是根据所在的操作系统平台来优化Apache,提高 Apache的效率,保证Apache的安全。 MPM 自身也是一个模块,这点我们能够从它的命名看出。值得注意的是,MPM 是 Apache 中唯一的一个系统层模块(因此开发 MPM 已经超出本书关于应用程序开发的范围)。同样一个 Apache实例只能有一个在编译时所选择的MPM。 2.3.1 为什么需要 MPM 老版本的 NCSA server 和 Apache 1 是在 UNIX系统中成长起来的。当时 Apache是一个多进程服务器,一个服务进程处理一个用户请求,如果当前并发客户访问数量大于服务进程数,Apache 便会增加新的服务进程来处理当前请求。在正常情况下,Apache 会维护一定数量的服务进程来处理用户的请求。尽管这种多进程服务机制在Unix类 2 系统中能够很好地工作,但是在其他的平台上效率却很低,如在Windows 中产生一个进程是非常费时的。因此,让 Apache真正实现跨平台还需要其他的方法。Apache2 采用的方法是把核心任务处理作为一个可插拔的模块,即 MPM,使其能针对不同的环境进行优化。MPM 架构允许不同的 Apache 模块在一个操作系统平台下共存,能够为用户根据不同应用做出选择。 2 这里的以及本书中出现的术语“UNIX 家族”是指 UNIX 系统本身以及其他的以 POSIX 为中心的操作系统,如Linux和MacOSX。2.3多处理模块MPMApache模块开发指南 27 在实际应用中,只有 UNIX 类操作系统有其他的选择 3 ,而其他系统平台(Windows、 Netware、OS/2、BeOS)则只有唯一的根据操作系统优化的 MPM。在 UNIX 平台上, Apache 2.2 目前已经有两种高质量的、作为标准的 MPM(Prefork 和 Worker),第三种(Eevent 方式)在不使用 SSL 的情况下也是稳定可靠的。另外还有一些 MPM 可以实验应用,暂时不适合产品应用。其他第三方的 MPM 模块也是可用的。 2.3.2 UNIX 类的 MPM 模块l Prefork MPM基于非线程模型,和Apache1.x版本中的MPM很相似。 Prefork MPM 在所有情况下都很安全,对运行非线程安全(nonthreadsafe)模式的软件如 PHP,它是唯一的安全选择。对于某些应用程序,包括在Apache1.3 上非常流行的程序(如简单静态页面、CGI 脚本等),Prefork MPM 是最好的选择 4 。l Worker MPM基于线程模式,具有内存消耗低(对繁忙的服务很重要)、扩展性在某些特定应用情况下比 Prefork 更好等优点。在稍后介绍 SQL 数据库支持和mod_dbd模块时我们会讨论其中一些内容。l以上两种稳定的 MPM 方式在非常繁忙的服务器应用下都有些不足。尽管 HTTP 的 Keepalive方式能减少 TCP 连接数量和网络负载,但是 Keepalive需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。Event MPM 是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源
本文标题:Apache介绍
链接地址:https://www.777doc.com/doc-6446083 .html