Apache HTTP 服务器版本 2.4
描述 | 实现混合多线程多进程 Web 服务器的多处理模块 |
---|---|
状态 | MPM |
模块标识符 | mpm_worker_module |
源文件 | worker.c |
此多处理模块 (MPM) 实现混合多进程多线程服务器。通过使用线程来处理请求,它能够使用比基于进程的服务器更少的系统资源来处理大量请求。但是,它通过保持多个进程可用(每个进程都有多个线程)来保留基于进程的服务器的大部分稳定性。
用于控制此 MPM 的最重要的指令是 ThreadsPerChild
,它控制每个子进程部署的线程数量,以及 MaxRequestWorkers
,它控制可能启动的线程的最大总数。
单个控制进程(父进程)负责启动子进程。每个子进程根据 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
指令进行配置。 性能提示 文档包含有关此互斥锁的更多信息。