Apache的prefork模式和worker模式

目录

Prefork 模式

这个多路处理模块(MPM)实现了一个非线程型的、预派生的 web 服务器,工作方式类似于 Apache 1.3。

特点

  • 适合没有线程安全库、需要避免线程兼容性问题的系统
  • 适合要求每个请求相互独立的场景
  • 一个请求出现问题不会影响其他请求

配置管理

  • 最重要的是将 MaxClients 设置为足够大的值以处理请求高峰
  • 同时不能太大以至于超出物理内存容量
  • 具有很强的自我调节能力,只需很少配置指令
<IfModule mpm_prefork_module>
ServerLimit 256
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 256
MaxRequestsPerChild 0
</IfModule>

Worker 模式

此多路处理模块(MPM)使 web 服务器支持混合的多线程多进程方式。

特点

  • 由于使用线程处理请求,可以处理海量请求
  • 系统资源开销小于基于进程的 MPM
  • 同时使用多进程和线程,结合两种方式的优势
  • 每个进程有多个线程,获得基于进程 MPM 的稳定性

关键配置

  • ThreadsPerChild:每个子进程的线程数
  • MaxClients:总线程数
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>

两种模式的比较

指标PreforkWorker
进程结构多进程单线程多进程多线程
效率在大多数平台上更高相对较低
内存占用较大较小
适用场景兼容性、调试友好高流量并发
优势稳定、兼容第三方模块资源消耗少、高并发
劣势内存占用多线程调试困难、某个线程崩溃会影响整个进程

总体:prefork 方式速度略高于 worker,但需要更多 CPU 和内存资源。

模式切换

  1. 将当前 prefork 启动文件改名:
mv httpd httpd.prefork
  1. 将 worker 启动文件改名:
mv httpd.worker httpd
  1. 修改 Apache 配置文件 /usr/local/apache2/conf/extra/httpd-mpm.conf

  2. 重新启动服务:

/usr/local/apache2/bin/apachectl restart

建议:出于稳定性和安全考虑,不建议更换 Apache 运行方式。很多 PHP 模块不能工作在 worker 模式下(例如许多 Linux 发行版自带的 PHP 不支持线程安全),所以最好保持系统默认的 prefork 模式。

配置详解

Prefork 配置参数

  • ServerLimit:MaxClients 最大为 256,超过此限需设置此参数,最大值为 20000
  • StartServers:启动时创建的子进程数(默认 5)
  • MinSpareServers:最小空闲子进程数(默认 5)
  • MaxSpareServers:最大空闲子进程数(默认 10)
  • MaxClients:最大并发请求数(默认 256)
  • MaxRequestsPerChild:每个子进程的最大请求数(默认 10000,0 表示无限)

Worker 配置参数

  • StartServers:启动时创建的子进程数(默认 3)
  • MaxClients:最大并发请求数,即最大总线程数(默认 400)
  • MinSpareThreads:最小空闲线程数(默认 75)
  • MaxSpareThreads:最大空闲线程数(默认 250)
  • ThreadsPerChild:每个子进程的常驻线程数(默认 25)
  • MaxRequestsPerChild:每个子进程的最大请求数(0 表示无限)

注意:ServerLimit 必须放在其他指令前面才能生效。如需设置更大的 MaxClients,必须同时增加 ServerLimit。

#apache #php