答案1
正如文档所述,如果您需要避免线程化以实现与非线程安全库的兼容性,则应使用 prefork MPM。通常,任何非平凡的 Apache 模块(mod_php
——或者更准确地说,它链接到的无数扩展和库——是典型示例)都具有某种非线程安全的库(或其中包含非线程安全的代码),因此,除非您使用的是相当普通的 Apache 安装,否则我会选择 prefork MPM。
答案2
在服务大量(>100)并发连接的同时运行不安全扩展的经典解决方案是在 fastCGI(mod_fcgid,一个本机 apache 模块)上运行 PHP,并将动态请求代理到运行 Worker MPM 的 apache 实例。
在提供静态和动态内容混合时,这将使您能够以适量的内存(4〜8GB)从几百个扩展到超过 1000 个并发连接。
当然,您还应该将前端缓存解决方案作为整体部署的一部分进行调查(memcached、varnish)。
或者,升级到 apache 2.4 及其原生事件MPM,它以改进的方式处理并发性(线程在连接时触发,而不是等待轮询。)
答案3
这个问题发布已经大约 3 年了,但我建议您即使使用 PHP 也使用 worker MPM 而不是 pre-fork,以获得更好的性能。
至于区别,pre-fork 是非线程的,因此服务器会为每个客户端请求分叉一个进程(它会在预期新请求时进行预分叉,这样分叉就不会占用响应时间)。由于请求在单独的进程中处理,因此这通常会占用比以前更多的内存和 CPU。worker 带来多线程,它更轻量,内存利用率更高。
答案4
这需要根据您将拥有的流量类型和种类来确定。此外,您首先需要了解 prefork 和 worker 之间的主要区别。希望下面的文章能帮助您弄清楚! http://slashroot.in/nginx 与 apache 有何不同