要安装哪个:Apache Worker或Prefork?每种(缺点)有什么优点?


55

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

我想知道的是:

  • 两个版本之间有什么区别?
  • 每种服务器类型的(缺点)有哪些优点?
  • 是否有根据条件选择哪种类型的基本准则?
  • 两者之间在性能上有很大的不同吗?

Answers:


40

如文档所述,如果需要避免使用线程与非线程安全的库兼容,则应使用prefork MPM。通常,任何不平凡的Apache模块(mod_php或更确切地说,是它链接到的众多扩展和库-都是典型的例子)都具有某种非线程安全的库(或具有非线程安全的库)。安全代码),因此除非您使用大量的Apache安装,否则我会选择prefork MPM。


3
除非您正在运行PHP,否则我本来建议工作程序MPM。推荐使用apache的MPM作为Worker,它可以提供更好的性能和更低的开销。只是PHP开发人员从未听说过需要使用prefork的线程安全性。
David Pashley 09年

16
PHP长期以来一直是线程安全的。他们仅建议使用预分叉器,因为它们无法控制其他库的工作。退出将PHP归咎于其他开发人员的不作为。
Alister Bulman

3
PHP可能是线程安全的(尽管我对此表示怀疑),但是链接到的所有库绝对不是。在这里,我们运行了一些相当大的PHP应用程序,并且每隔几个月我们会尝试从prefork切换到worker,但是我们会立即损坏数据。
Aleksandar Ivanisevic,2009年

5
至少函数更改ENV变量将不是线程安全的,setlocal php.net/manual/en/function.setlocale.php是这种情况的常见示例
半径

4
注意事项:如果php-fpm通过FastCGI 附加PHP,则这些问题不适用。然后,工作程序MPM就很好了-然后,fpm将在自己的进程中运行每个PHP请求,而Apache可以线程化运行。PHP线程安全性问题仅阻止您使用mod_php,后者在Apache进程内运行PHP。
mschuett 2012年

13

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

当混合使用静态和动态内容时,这可以使您从数百个并发连接扩展到具有适度内存(4〜8GB)的> 1000。

当然,您还应该在整体部署(memcached,varnish)中研究前端缓存解决方案。

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


您可以扩展一下事件mpm评论吗?与mpm-worker相比如何堆叠?
Sirex

虽然工作程序MPM已经基于线程,因此启动速度更快,运行起​​来也更轻松,但事件MPM不再轮询套接字-它在活动时得到通知;因此,“事件”。
适配器2012年

所以它应该在高流量(13k / sec)的站点上更好地工作?
Sirex

6

自问题发布以来已经有3年了,但是我建议您使用工人MPM而不是使用前叉,即使使用PHP,也可以获得更好的性能。

至于差异,预分叉是非线程的,因此服务器为每个客户端请求分叉一个进程(它在预期新请求时会进行预分叉,以便分叉不会占用响应时间)。由于请求是在单独的进程中进行服务器处理,因此这通常会使您的内存和CPU负担更多。工作者带来了更轻的多线程,并具有更好的内存利用率。


2

这对于您所服务的内容来说非常特殊。如果您要进行很多小的静态连接,则线程会更轻,更快。如果您只是不断产生少量大型应用程序,那么由于它的成熟度和稳定性,Prefork可能具有优势。为什么不只是设置所需的东西,测试一个,换出MPM模块,再试一次,看看哪个更适合您呢?


您无法在Apache 2.2中随意“交换” MPM;您不能在apache 2.2中随意交换MPM。它在编译时设置。
适配器

您可以使用apt或RPM。Debian有几种不同的Apache 2软件包,具体取决于您喜欢的样式。
布伦丹·伯德

1

需要您拥有的流量类型和种类。首先,您还需要了解前叉和工人之间的主要区别。希望下面的文章能帮助您找到答案! http://slashroot.in/how-is-nginx-different-from-apache


2
我们希望答案具有内容,而不是内容的链接。如果您可以提供链接目标上的摘要,那是最佳实践。链接腐烂发生。
sysadmin1138

1
问题是关于Apache(nginx不是Apache)和prefork或线程的相对优点(nginx都不使用)
symcbean 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.