“Apache MPM worker”的原理与默认设置

该多处理模块(MPM)综合了多进程多线程服务器应用。通过使用线程应对服务请求,能在系统资源少的情况下处理大量请求。它通过在每个进程下保持许多线程,仍然保留住了基于流程服务器的稳定性。

控制MPM最重要的指令是“ThreadsPerChild”,通过控制启动的线程最大数量,控制每个进程和“MaxClients”部署的线程数

工作原理

单一控制进程(父)负责开始子进程。每个子进程按照“ThreadsPerChild”指令产生固定数量的服务线程,以及一个监听连接并将它们传输到服务线程加工处理的监听线程。

Apache总是尝试保持一个备用池或空闲服务器线程,随时准备应对服务请求。用这种方式,客户端不需要在请求得到应答之前等待产生新线程或进程。最初启动的进程数量由“StartServers”指令设定。在操作期间,Apache评估所有进程的闲置线程,然后forks或杀死进程,将数量保持在“MinSpareThreads”和“MaxSpareThreads”限定的范围内。

由于这一过程的自我调节能量非常强,几乎没必要修改这些指令的默认值。同时服务的客户端由“MaxClients”确定。活跃子进程的最大数量由“MaxClients” 指令除以“ThreadsPerChild”指令决定。

有两个指令设定活跃子进程数量和子进程里的服务器线程数量,并且只能通过完全停止服务器,然后重新启动才能改变。“ServerLimit”是活跃子进程的上限,必须大于或等于“MaxClients”指令除以“ThreadsPerChild”指令的值。“ThreadLimit”是服务器线程的上限,必须大于或等于“ThreadsPerChild”指令。如果这些指令没有定义默认值,它们会在其它其它worker指令之前出现。

控制进程和线程的典型mpm_worker_module配置如下:

ServerLimit 16
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25

尽管Unix下的父进程通常以root开始以便于绑定80端口,但Apache是以较小特权的用户启动子进程和线程。User和Group指令用于设定Apache子进程的特权。子进程必须有能力阅读服务的内容,但除此之外的特权很少。此外,除非使用suexec,这些指令能被CGI脚本传承。

“MaxRequestsPerChild”控制杀死老进程并启动新进程的服务器循环过程。