Apache HTTP 服务器版本 2.4
本文档描述了什么是多进程模块以及它们如何在 Apache HTTP 服务器中使用。
Apache HTTP 服务器旨在成为一个功能强大且灵活的 Web 服务器,可以在各种平台上以各种不同的环境运行。不同的平台和不同的环境通常需要不同的功能,或者可能以不同的方式最有效地实现相同的功能。Apache httpd 一直通过其模块化设计来适应各种环境。这种设计允许网站管理员通过选择在编译时或运行时加载哪些模块来选择哪些功能将包含在服务器中。
Apache HTTP 服务器 2.0 将这种模块化设计扩展到 Web 服务器的最基本功能。服务器附带了一系列多进程模块 (MPM),这些模块负责绑定到机器上的网络端口、接受请求以及调度子进程来处理请求。
将模块化设计扩展到服务器的这一级别带来了两个重要的好处
mpm_winnt
可以使用本机网络功能来代替 Apache httpd 1.3 中使用的 POSIX 层。此优势也扩展到实现专用 MPM 的其他操作系统。worker
或 event
,而需要稳定性或与旧软件兼容性的站点可以使用 prefork
。在用户级别,MPM 看起来很像其他 Apache httpd 模块。主要区别在于,一次只能将一个且仅一个 MPM 加载到服务器中。可用 MPM 的列表显示在 模块索引页面 上。
下表列出了各种操作系统的默认 MPM。如果您在编译时没有做出其他选择,这将是选择的 MPM。
Netware | mpm_netware |
OS/2 | mpmt_os2 |
Unix | prefork 、worker 或 event ,具体取决于平台功能 |
Windows | mpm_winnt |
这里,“Unix”用于表示类 Unix 操作系统,例如 Linux、BSD、Solaris、Mac OS X 等。
在 Unix 的情况下,安装哪个 MPM 的决定基于两个问题
1. 系统是否支持线程?
2. 系统是否支持线程安全的轮询(具体来说是 kqueue 和 epoll 函数)?
如果这两个问题的答案都是“是”,则默认 MPM 为 event
。
如果问题 #1 的答案是“是”,但问题 #2 的答案是“否”,则默认值为 worker
。
如果这两个问题的答案都是“否”,则默认 MPM 将为 prefork
。
实际上,这意味着默认值几乎总是 event
,因为所有现代操作系统都支持这两个功能。
MPM 可以作为所有平台上的静态模块构建。在构建时选择一个 MPM 并将其链接到服务器。必须重新构建服务器才能更改 MPM。
要覆盖默认 MPM 选择,请使用 configure
脚本的 --with-mpm=NAME
选项。NAME 是所需 MPM 的名称。
服务器编译完成后,可以使用 ./httpd -l
确定选择了哪个 MPM。此命令将列出编译到服务器中的每个模块,包括 MPM。
在 Unix 和类似平台上,MPM 可以作为 DSO 模块构建,并以与其他 DSO 模块相同的方式动态加载到服务器中。将 MPM 构建为 DSO 模块允许通过更新 MPM 的 LoadModule
指令来更改 MPM,而不是通过重新构建服务器来更改 MPM。
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
尝试 LoadModule
多个 MPM 将导致启动失败,并出现以下错误。
AH00534: httpd: Configuration error: More than one MPM loaded.
此功能使用 configure
脚本的 --enable-mpms-shared
选项启用。使用参数 all
,将安装平台上所有可能的 MPM。或者,可以指定 MPM 列表作为参数。
默认 MPM(无论是自动选择还是使用 configure
脚本的 --with-mpm
选项指定)将在生成的服务器配置文件中加载。编辑 LoadModule
指令以选择不同的 MPM。