二 配置MPM
Apache 是模块化的,因为可以轻松添加和移除特性。在Apache 的核心,多处理模块(Multi-Processing Module,MPM )提供了这种模块化功能性―― 管理网络连接、调度请求。MPM 使您能够使用线程,甚至能够将Apache 迁移到另外一个操作系统。
每次只能有一个MPM 是活动的,必须使用 --with-mpm=(worker|prefork|event) 静态编译。
每个请求使用一个进程的传统模型称为 prefork 。较新的线程化模型称为 worker,它使用多个进程,每个进程又有多个线程,这样就能以较低的开销获得更好的性能。最新的 eventMPM 是一种实验性的模型,为不同的任务使用单独的线程池。要确定当前使用的是
哪种MPM ,可执行 httpd -l。例如:
[root@localhost conf]# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
选择使用何种MPM 取决于许多因素。在event MPM 脱离实验状态之前,不应考虑这种模型,而是在使用线程和不使用线程之间作出
选择。表面上看来,如果所有底层模块(包括PHP 使用的所有库)都是线程安全的,线程要优于分叉(forking)。
而Prefork 是较为安全的选择;如果选择了worker,则应该谨慎测试。性能收益还取决于您的发布版所附带的库及硬件无论选择了哪种MPM ,都必须恰当地配置它。一般而言,配置MPM 包括告知Apache 怎样去控制有多少worker 正在运行,它们是
线程还是进程。prefork MPM 的重要配置选项如清单1 所示。编辑http.conf 主配置文件可以看到:
StartServers 50 #预先启动进程
MinSpareServers 15 #最小空闲进程
MaxSpareServers 30 #最大空闲进程
MaxClients 225 #允许连接数
MaxRequestsPerChild 4000
prefork 模型会为每个请求创建一个新进程。多余的进程保持空闲,以
处理传入的请求,这缩短了启动延迟。只要Web 服务器出现,预先完
成的配置就会立即启动50 个进程,并尽力保持10 到20 个空闲服务器
运行。进程数的硬性限制由 MaxClients 指定。尽管一个进程能够处
理许多相继的请求,Apache 还是会取消连接数超过4,000 以后的进
程,这降低了内存泄漏的风险。
配置线程化MPM 与之类似,不同之处只是必须确定使用多少线程和进
程。Apache 文档解释了所有必要的参数和计算。
prefork 模型会为每个请求创建一个新进程。多余的进程保持空闲,以
处理传入的请求,这缩短了启动延迟。只要Web 服务器出现,预先完
成的配置就会立即启动50 个进程,并尽力保持10 到20 个空闲服务器
运行。进程数的硬性限制由 MaxClients 指定。尽管一个进程能够处
理许多相继的请求,Apache 还是会取消连接数超过4,000 以后的进
程,这降低了内存泄漏的风险
配置线程化MPM 与之类似,不同之处只是必须确定使用多少线程和进
程。Apache 文档解释了所有必要的参数和计算。要经过几次尝试和出错之后才能选好要使用的值。最重要的值是MaxClients。目标在于允许足够多的workder 进程或线程运行,同时又不会导致服务器进行过度的交换。如果传入的请求超出处理能力,那么至少满足此值的那些请求会得到服务,其他请求被阻塞。
如果 MaxClients 过高,那么所有客户机都将体验到糟糕的服务,因为Web 服务器会试图换出一个进程,以使另一个进程能够运行。而设得过低意味着可能会不必要地拒绝服务。查看高负载下运行的进程数量和所有Apache 进程所导致的内存占用情况对设置这个值很有帮助。如果 MaxClients 的值超过256,必须将 ServerLimit 也设为同样的数值。
Apache 处理的每个请求都要履行一套复杂的规则,这些规则指明了Web 服务器必须遵循的约束或特殊指令。对文件夹的访问可能按
IP 地址约束为某个特定文件夹,也可配置用户名和密码。这些选项还包含处理特定文件,例如,如果提供了一个目录列表,该如何处
理的文件,或输出结果是否应压缩。
这些配置以httpd.conf 中容器的形式出现,例如<Directory>,以便指定所用配置引用的是磁盘上的一个位置;再如<Location>,表
示引用是URL 中的路径。清单2 展示了一个实际的Directory 容器。
php.ini
PHP 的配置是在php.ini 中完成的。四个重要的设置控制PHP 可使用多少系统资源,如表1 所列。
表1. php.ini 中与资源相关的设置
设置 描述 建议值
max_execution_time 一个脚本可使用多少CPU 秒 30
max_input_time 一个脚本等待输入数据的时间有多长(秒) 60
memory_limit 在被取消之前,一个脚本可使用多少内存(字节) 32M
output_buffering 数据发送给客户机之前,有多少数据(字节)需要缓存 4096
具体数字主要取决于您的应用程序。如果要从用户处接收大文件,那么 max_input_time 可能必须增加,可以在php.ini 中修改,也
可以通过代码重写它。与之类似,CPU 或内存占用较多的程序也可能需要更大的设置值。目标就是缓解超标程序的影响,因此不建
议全局禁用这些设置。关于 max_execution_time,还有一点需要注意:它表示进程的CPU 时间,而不是绝对时间。因此一个进
行大量I/O 和少量计算的程序的运行时间可能远远超过 max_execution_time。这也是 max_input_time 可以大于
max_execution_time 的原因所在。
PHP 可执行的日志记录数是可配置的。在生产环境中,禁用除最重要的日志以外的一切日志记录能够减少磁盘写操作。如果需要使用
日志来排除问题,那么可以按需启用日志记录。error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR 将启用足够
的日志记录,使您发现问题,同时从脚本中消除大量无用的内容。
回页首