Nginx + php-fpm是否比Apache + mod-php更快?

35
我有一个基于PHP的Web应用程序,在Apache服务器上运行,后端有相当数量的PHP处理。由于整体性能较低,我努力改进了应用程序的性能。首先我采用了客户端缓存、启用gzip压缩、js-css文件压缩等技术,这些方法使应用程序的性能得到了很大程度的提高。
为了进一步提高性能,我想尝试在服务器层面进行改进。因此,我尝试比较在Apache和Nginx服务器上托管应用程序的性能。
  • Nginx版本-1.0.15;
  • Apache版本-2.2.15;
  • php版本-5.4.38;
在Apache中,我使用Apache + mod-php,在Nginx中,我使用Nginx + php-fpm进行比较。正如大多数教程所解释的那样,我将Nginx工人的数量配置为我的处理器核心数。我使用jmeter进行压力测试,并生成了以下图表。
在所有这些图表中,x轴是我发送的每个请求,y轴是获取每个请求响应所需的毫秒数。 访问登录页面

enter image description here

提交登录页面

enter image description here

访问主页

enter image description here

我只能在1秒内登录100个并发用户进行测试,因为之后开始在两种服务器设置中丢弃请求。 Nginx的性能略有改善,但与Apache相比差别不大,值得更改所有服务器架构从Apache到Nginx。而且当我观察服务器资源利用率时,我也没有发现Nginx和Apache之间有太大的区别。

在阅读其他人的比较时,我发现他们声称Nginx在并发访问方面要快得多,如下图所示。

http://www.eschrade.com/wp-content/uploads/2014/01/event-mpm-nginx.gif

但是,即使在1秒内进行100次并发访问,我也无法观察到Nginx在性能方面与Apache有任何主要差异。

以下是我的问题。

  1. Nginx + php-fpm是否由于资源的有效利用而应该比Apache + mod-php更快地执行服务器操作?
  2. Nginx只推荐为静态内容提供服务,而不适合重负载的服务器操作网站吗?
  3. 有没有更好的配置Nginx以获得更好的性能提升的方法?

1
实际上可能恰恰相反,因为没有进程间通信。除此之外,为什么PHP本身应该运行得更快呢?它是同一版本的同一引擎。 - zerkms
3
php-fpm与提供静态内容有什么关联? - zerkms
1
我会点赞这个问题,因为它写得很好并且表述清晰。但是我会投票关闭它,因为(1)和(2)大多数是基于个人观点的,而配置/性能优化问题(3)对于有用的答案来说有些过于宽泛。 - mario
@zerkms 是的,它使用相同的PHP版本,但是php-fpm应该更快,因为它使用FastCGI进程机制,这可以使用更少的内存。这是我在互联网上找到的。http://www.quora.com/What-are-the-advantages-of-using-PHP-FPM-+-Nginx-over-Apache-and-mod_phphttp://blog.a2o.si/2009/06/24/apache-mod_php-compared-to-nginx-php-fpm/ - Thilanka
“但是,php-fpm 应该会更快,因为它使用 FastCGI。” --- FastCGI 只是一种 SAPI,它并不会使 PHP 本身变得更快或更慢。但是,FastCGI 的存在会使请求传输变慢-因为您需要连接和传输请求,而在 mod_php 中,它在同一进程内存空间中。 - zerkms
显示剩余5条评论
6个回答

33

我对此进行了更多的研究,发现Nginx在处理静态资源方面表现良好,但在处理其他动态内容传递(如需要使用外部应用程序php-fpm进行处理的php处理)方面表现不佳。因此,如果您的Web应用程序在php处理方面存在性能瓶颈,则用Nginx替换Apache将不是一个解决方案。

下面的文章详细介绍了使用Apache + mod_php和Nginx + php-fpm比较静态内容传递和php脚本结果传递所做的研究。

http://blog.a2o.si/2009/06/24/apache-mod_php-compared-to-nginx-php-fpm/

以下是上述文章中描述的结论要点。

结论:“是否应该从Apache转换到Nginx?”

  • 简短回答:我不知道。
  • 较长的答案在这里:

    1. 如果您托管许多网站,并且用户经常使用.htaccess文件并频繁更改它们,则答案可能为“否”。将成本切换到Nginx并将所有配置转换为新格式的成本通常达到购买另一台服务器的成本。
    2. 如果您在多个服务器上拥有单个应用程序,并且大部分处理能力不是由提供静态文件内容而消耗的,则答案也可能为“否”。
    3. 如果您主要提供静态内容,则答案显然是“是”。
    4. 如果您正在创建面向Web托管解决方案的新系统,则答案可能为“是”,并假设用户不会错过.htaccess功能,或者将通过其他方式提供它
    5. 如果您正在使用某些虚拟化技术整合服务,则答案可能为“是”,因为Nginx倾向于比Apache具有更小的内存占用。
    6. 如果您正在寻求Nginx作为PHP服务器优化,请再次查看您的应用程序代码,而不是Nginx。

1
跟进这篇几年前的(但解释得很好)观点,现在PHP-FPM处理与Nginx和FastCGI缓存配对非常出色,特别是现在有了OPcache和全新的OPcache文件缓存,它们为扩展基于PHP的网站做出了巨大贡献。而使用.htaccess文件是一个主要的安全风险,此外它允许用户“黑客”你可能不想让他们访问的配置。除了低端共享主机,Nginx几乎总是更好的选择。 - Jesse Nickles

17

虽然有很多声称它更快的说法,但实际上并非如此,至少不是无条件地更快。

到底哪个更快,mod_php 还是 ext-fpm,还没有得到证明,而且可能会有所不同。在性能方面,您需要考虑三个因素:理论、实现、用例、资源和负载。

从理论上讲,mod_php 是最快的可达成的。使用 mod_php,Web 服务器和解释器直接通信,共享相同的资源和内存空间。而 ext-fpm 则需要通过分离的进程进行通信,并且必须复制资源。

传统上,独立的进程非常流行,因为它们通常具有更大的灵活性,例如可以作为许多不同用户、不同版本同时运行等。许多人也使用多进程系统,因为他们不想费心去 free()fclose() 等操作。

虽然 ext-fpm 使用 FastCGI 尝试使分离进程模型达到其最大理论速度,但最大理论速度仍比统一进程的最大理论速度慢。

找出哪个更快可能是困难的。即使其他人的测试已经很好地组织,但它们可能与您的用例和设置无关,因此不可靠。在您自己的测试中,您可能会使其中一个比另一个更快,但这并不意味着其他人不能改变这一点。那个人可以是您,如果您有更多的时间和理解。

mod_php 的实现并不一定使它达到最大理论速度。两者之间的距离可能没有人们期望的那么远,特别是当很多时候 SAPI 开销与提供静态请求时发生的其他所有操作相比微不足道时。许多基准测试必须使用虚拟的 noop 脚本进行测试,以便差异显得明显。

已经成为普遍信仰的是 ext-fpm “很快”。许多力量维持了这种说法,其中一些是无辜的,另一些则源于无能,还有一些是纯粹的操纵。

  1. Apache httpd不建议使用mod_php与线程MPMs一起使用,有多种原因。带有线程或事件驱动模型的Apache httpd可能会对不提供PHP服务的请求产生一些性能影响。虽然PHP在支持线程和事件驱动模型方面取得了重大进展,但距离事件驱动仍有很长的路要走,而它的线程支持也没有像传统的进程支持那样经过充分的测试。许多人对此感到困惑。这并不是使PHP更快的东西,而是一种权衡。这可能会减慢PHP,加快静态内容。Apache已经开始完全不推荐使用mod_php,这可能会让很多人感到困惑,也可能是错误认为ext-fpm“更快”的产生的根源。
  2. 由于像Apache这样的推荐,许多人尝试了ext-fpm,然后在他们的平台上,如演讲或博客,报告了他们的轶事“成功”,这就将现象传播到更广泛的易受影响的观众中去。
  3. 有时候当切换到ext-fpm时,结果更好的原因往往不是人们所期望的。许多人从mod_php切换到ext-fpm时,会做更多的改变或其他因素会起作用。
  4. 在技术领域,快这个词尤其棘手。它经常并不真正意味着什么。我使用的几个品牌为快(非常流行的技术)的系统最后都被证明是相反的。许多人把快当成最快的意思。实际上,它往往意味着不多。在感知方面,快是什么?一个以100RPM旋转的硬盘对大多数人来说似乎在“快速”旋转。一个以1000RPM旋转的硬盘对大多数人来说似乎在“快速”旋转。最快往往意味着不多。
  5. 利益冲突。nginx有一个商业企业,尚不清楚它是否可能成为ext-fpm营销的来源。它为人们服务于nginx,使人们相信它比可供竞争web服务器使用的mod_php更快。然而,nginx和PHP之间有第三方模块可用,因此似乎不太可能成为ext-fpm游说的一个来源。然而,谷歌的前几个搜索结果来自于一篇营销博客,试图吸引商业托管服务的流量,跳过了大部分相关细节,因此有许多人在利用它。

通常当人们看到不同的结果时,他们无法欣赏为什么会出现这种情况。他们的过程、测量和流量的细节被省略了。然后人们经常试图重复这些成功,而失败,留下无尽的搜索结果,人们询问为什么它没有变得更快。其中一个重要因素是,在使用基于多进程的MPM与mod_php且具有静态内容负载的情况下,人们发现成功的案例可能具有特别的欺骗性,因为来自静态请求的负载可能会反弹回PHP。

另一个常见的错误是人们也会测试两种不同的配置。php-fpm的配置可能比mod_php更优化。有时,人们只优化他们预期更快的那个而忽略了原来的那个。这在人们可能不检查请求是否成功同时更改诸如内存限制或最大执行时间等内容时尤其相关。当人们只想改变SAPI时,配置中很多东西都会发生变化,有时即使不可避免,有时甚至是透明的。一个常见的例子可能是,web服务器上的限制可能不足以最大化利用服务器资源,而ext-fpm将能够生成额外的进程来利用额外的核心。通常可以看到人们将路由等内容从PHP转移到FPM的web服务器上。
与使用多进程单线程MPM的mod_php相比,ext-fpm具有许多全面的好处,尽管并不能严格保证更高的性能。但如果您的负载完全是为了服务于PHP请求,则Apache已经实现了ext-fpm应该做的事情。
还有一些差异,例如延迟与吞吐量、周期与字节与等待。
理论上,未来的方向是使用ngx_php或mod_php的php-zts。但是,重要的是要注意,与php-nts相比,php-zts没有得到足够的采用和关注,因此它会给PHP执行本身带来开销,这使得目前很难与php-fpm竞争。实现没有将其带入达到最佳状态的领域。在某些情况下,不太理想可能是一个低估的说法。许多人担心线程化的PHP可靠性问题,这可能会影响您,也可能不会。如果您只提供动态内容而不运行共享托管服务,则这肯定不会成为太大的问题。这似乎潜在地是由Apache组织的一场恐慌活动。有足够的使用php-zts的人在其中它是唯一选项的平台上,使它相对稳定。
还有其他选项,但可能需要更多的操作。甚至可以自己打开unix套接字,解析FCGI并使用诸如select之类的内容异步处理它。 PHP中基于事件驱动的缺点是,大多数主要的高级IO库(如MySQL)不以统一的方式支持它。 php-swoole看起来很有前途,尽管现在还为时过早。php-fpm、mod_php和php-zts的情况有些混乱。

1
这个答案非常详细,但有点误导,因为你的很多信息是在比较Apache的mod_php和ext-fpm,而OP(过时的)问题是关于Apache/mod_php与Nginx/PHP-FPM的。简而言之,现在PHP-FPM更受Apache欢迎,因为它更可靠,对于Nginx来说,它确实是唯一可用的PHP处理器。好消息是,PHP-FPM作为一个项目现在比以前更好地维护,并且它现在在Apache和Nginx中都很受欢迎,这意味着它们之间有更多的共性。 - Jesse Nickles

13

我有一个负载均衡3台服务器的网站。其中2台正在运行nginx和PHP-FPM(新的)。然而,主要服务器是在Apache + PHP FastCGI上运行,占大约40%的流量。最近我想将Apache也更改为nginx;因此,我在同一台服务器上为不同的IP安装了nginx并进行了一些测试。但出乎意料的是,Apache可以在每次访问时以10-20毫秒的速度生成页面,而nginx需要60-70毫秒。nginx对于静态文件来说更快,但如果你有CDN,就不需要担心静态内容。Apache是一个很棒的服务器。但请尝试FastCGI而不是PHP模块。


1
其实我尝试过使用Nginx+PHP+fpm,但性能略有下降。所以我会回到Apache+PHP-fpm,并让Nginx作为Apache的负载均衡器。我还使用Nginx来提供静态内容,如图片等。这是一个非常好的组合:Apache+PHP-fmp,Nginx作为负载均衡器和静态内容服务器!

1
这并没有提供问题的答案。您可以搜索类似的问题,或者参考页面右侧的相关和链接问题来找到答案。如果您有一个相关但不同的问题,请提出新问题,并包含此问题的链接以帮助提供上下文。请参阅:提问,获取答案,无干扰 - phoenixstudio

0

Apache使用傳統的基於文件的方法來處理靜態內容。這種傳統方法有點老式,如果考慮到今天處理靜態內容的高標準,則性能稍微低一些。另一方面,Apache Web服務器更加重視動態內容,並通過內置處理器對它們進行處理。動態內容與Web服務器一起執行,無需外部組件。

正是這種處理內部動態內容的能力,使Apache成為最適合具有更多動態內容的Web應用程序的最佳表現Web服務器。談到Nginx,Nginx缺乏內部處理動態內容的能力。它使用外部處理器進行此類執行,因此需要等待發送請求到外部處理器並獲取響應,這會顯著降低性能。在應用程序上有太多的Web流量時,配置Nginx和外部處理器之間的通信有時也可能變得復雜。這在某種程度上是一種隱藏的好處。這使得Nginx能夠更快速地內部處理靜態內容。

结论: 由于网站的大部分内容都是静态内容,而大多数媒体文件实际上是 Web 应用程序的静态内容,因此人们总是发现 Nginx 比 Apache 提供更高的速度。这就是为什么多年来,许多网站所有者已经从 Apache + PHP-FPM 切换到 Nginx + PHP-FPM,并在处理大量流量时获得了更好的性能。但是,如果您有一个网站,其中有更多的动态内容,而 PHP 必须完成大部分工作,而不是 Web 服务器必须完成更多工作,就像静态内容网站一样,那么 Apache 总是会提供更快的性能。


0

快得多 - 没有

它大约快10%(这是我的测试结果),但在高负载下要好得多。

由于我找不到任何好的性能测试,所以决定自己进行测试。

我测试了PHP 8.2 Apache与mod_php对比Nginx与php-fpm

在我的测试中,我发现在高负载下,Apache与mod_php表现要差得多,而Nginx与php-fpm则表现更好。

我写了一篇关于这个的文章,其中包含图表和更多信息 - mod_php vs php-fpm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接