Apache HTTP 服务器版本 2.4

| 描述 | 实现混合多线程多进程 Web 服务器的多处理模块 |
|---|---|
| 状态 | MPM |
| 模块标识符 | mpm_worker_module |
| 源文件 | worker.c |
此多处理模块 (MPM) 实现混合多进程多线程服务器。通过使用线程来处理请求,它能够使用比基于进程的服务器更少的系统资源来处理大量请求。但是,它通过保持多个进程可用(每个进程都有多个线程)来保留基于进程的服务器的大部分稳定性。
用于控制此 MPM 的最重要的指令是 ThreadsPerChild,它控制每个子进程部署的线程数量,以及 MaxRequestWorkers,它控制可能启动的线程的最大总数。

CoreDumpDirectory
EnableExceptionHook
Group
Listen
ListenBacklog
MaxConnectionsPerChild
MaxMemFree
MaxRequestWorkers
MaxSpareThreads
MinSpareThreads
PidFile
ReceiveBufferSize
ScoreBoardFile
SendBufferSize
ServerLimit
StartServers
ThreadLimit
ThreadsPerChild
ThreadStackSize
User单个控制进程(父进程)负责启动子进程。每个子进程根据 ThreadsPerChild 指令中指定的数量创建固定数量的服务器线程,以及一个监听线程,该线程监听连接并在连接到达时将其传递给服务器线程进行处理。
Apache HTTP 服务器始终尝试维护一个 备用 或空闲服务器线程池,这些线程随时准备处理传入请求。这样,客户端无需等待创建新的线程或进程即可处理其请求。将要启动的进程数量由 StartServers 指令设置。在运行过程中,服务器会评估所有进程中空闲线程的总数,并创建或终止进程以使此数量保持在 MinSpareThreads 和 MaxSpareThreads 指令指定的边界内。由于此过程是高度自调节的,因此很少需要从其默认值修改这些指令。可能同时处理的客户端数量(即所有进程中线程的最大总数)由 MaxRequestWorkers 指令确定。活动子进程的最大数量由 MaxRequestWorkers 指令除以 ThreadsPerChild 指令确定。
两个指令对活动子进程的数量和子进程中服务器线程的数量设置了硬性限制,并且只能通过完全停止服务器然后重新启动服务器来更改。 ServerLimit 是活动子进程数量的硬性限制,必须大于或等于 MaxRequestWorkers 指令除以 ThreadsPerChild 指令。 ThreadLimit 是服务器线程数量的硬性限制,必须大于或等于 ThreadsPerChild 指令。
除了活动子进程集之外,还可能存在正在终止的额外子进程,但至少有一个服务器线程仍在处理现有客户端连接。最多可能存在 MaxRequestWorkers 个正在终止的进程,尽管实际数量预计会小得多。可以通过禁用单个子进程的终止来避免此行为,这可以通过以下方法实现
MaxConnectionsPerChild 的值设置为零 MaxSpareThreads 的值设置为与 MaxRequestWorkers 相同的值worker MPM 中进程线程控制的典型配置如下所示
ServerLimit 16 StartServers 2 MaxRequestWorkers 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25
虽然父进程通常在 Unix 下以 root 身份启动以绑定到端口 80,但子进程和线程由服务器以权限较低的用户的身份启动。 User 和 Group 指令用于设置 Apache HTTP 服务器子进程的权限。子进程必须能够读取将要提供的所有内容,但应尽可能少地拥有超出此范围的权限。此外,除非使用 suexec,否则这些指令还会设置 CGI 脚本将继承的权限。
MaxConnectionsPerChild 控制服务器通过终止旧进程并启动新进程来回收进程的频率。
此 MPM 使用 mpm-accept 互斥锁来序列化对传入连接的访问,当受到雷鸣般的羊群问题的影响时(通常,当存在多个监听套接字时)。此互斥锁的实现方面可以使用 Mutex 指令进行配置。 性能提示 文档包含有关此互斥锁的更多信息。