要安装哪个:Apache Worker 还是 Prefork?每个的(缺点)优点是什么?

Aro*_*eel 56 mpm-worker mpm-prefork apache-2.2

根据对PreforkWorker MPM的描述,prefork 类型似乎有些过时,但我真的找不到这两种类型的正确比较。

我想知道的是:

  • 两个版本有什么区别?
  • 每种服务器类型的(缺点)优势是什么?
  • 是否有关于根据条件选择哪种类型的基本准则?
  • 两者之间是否有很大的性能差异?

wom*_*ble 40

正如文档所说,如果您需要避免线程化以与非线程安全库兼容,则应使用 prefork MPM。通常,任何非平凡的 Apache 模块(mod_php——或者,更准确地说,它链接到的无数扩展和库——作为规范示例)都有某种非线程安全库(或者具有非线程安全库)安全代码),所以除非你使用的是非常好的 Apache 安装,否则我会选择 prefork MPM。

  • PHP 线程安全已经有很长一段时间了。他们只建议使用预分叉,因为他们无法控制其他库的行为。不要因为其他开发人员的不作为而责怪 PHP。 (16认同)
  • 至少函数改变 ENV 变量不会是线程安全的,setlocal http://php.net/manual/en/function.setlocale.php 是一个常见的例子。 (5认同)
  • 一个注意事项:如果通过 FastCGI 附加了 PHP,例如“php-fpm”,则这些问题不适用。然后工作 MPM 就好了——然后 fpm 将在自己的进程中运行每个 PHP 请求,而 Apache 可以运行线程。PHP-Thread-safety 问题只会阻止您使用 `mod_php`,它在 Apache 进程中运行 PHP。 (4认同)
  • 我会推荐工作 MPM,除非你运行 PHP。Worker 是 apache 推荐的 MPM,提供更好的性能和更低的开销。只是 PHP 开发人员从未听说过需要使用 prefork 的线程安全。 (3认同)
  • PHP 可能是线程安全的(尽管我对此表示怀疑)但它链接到的所有库绝对不是。在这里,我们运行了一些相当大的 PHP 应用程序,每隔几个月我们尝试从 prefork 切换到 worker,但我们会立即得到损坏的数据。 (3认同)

ada*_*ptr 14

在服务大量(> 100)并发连接时运行不安全扩展的经典解决方案是在 fastCGI(mod_fcgid,本机 apache 模块)上运行 PHP,并代理来自运行 Worker MPM 的 apache 实例的动态请求。

当提供静态和动态内容的混合时,这将使您能够以适度的内存 (4~8GB) 从几百个并发连接扩展到 >1000 个并发连接。

当然,您还应该研究前端缓存解决方案作为整体部署(memcached、varnish)的一部分。

或者,升级到 apache 2.4 及其本机事件MPM,它以大大改进的方式处理并发(线程在连接时被触发,而不是等待轮询。)


小智 6

问题发布已经过去了大约 3 年,但我建议您使用 worker MPM 而不是 pre-fork,即使使用 PHP,以获得更好的性能。

至于差异,预分叉是非线程的,因此服务器为每个客户端请求分叉一个进程(它预分叉以预测新请求,因此分叉不会占用响应时间)。由于请求是在单独进程中的服务器,因此这通常会大大增加您的内存和 CPU 的负担。Worker 带来了多线程,更轻巧,内存利用率更高。