Thi*_*nka 15 php apache performance nginx stress-testing
我在Apache服务器上运行基于PHP的Web应用程序,后端有大量的php处理.由于整体性能较低,我致力于提高应用程序的性能.首先,我遵循了客户端缓存,gzip启用,js-css缩小等技术,这些技术可以很好地提高性能.
为了进一步提高性能,我想尝试服务器级别的改进.所以我尝试通过在Apache和Nginx服务器上托管它来比较应用程序性能.
在Apache I用户Apache + mod-php和Nginx中,我使用Nginx + php-fpm进行比较.正如大多数教程所解释的那样,我将Nginx工作者的数量配置为等于处理器中的核心数量.我用jmeter做了压力测试,下面是我可以用它生成的图表.
在所有这些图中,x轴是我发送的每个请求,y轴是获取每个请求的响应的毫秒数.
访问登录页面

提交登录页面

访问主页

我只能在1秒内执行最多100个并发用户的测试,因为它在两个服务器设置之后开始丢弃请求.
Nginx的性能比Apache有所改善,但是将我的所有服务器架构从Apache更改为Nginx并不是一个主要的区别.当我观察服务器资源利用率时,我发现Nginx和Apache之间并没有太大区别
当我进行人们已经完成的其他比较时,我发现他们声称Nginx在并发访问中要快得多,如下图所示.
http://www.eschrade.com/wp-content/uploads/2014/01/event-mpm-nginx.gif
但我无法观察到Nginx在Apache上的性能有任何重大差异,即使在1秒内有100个并发访问.
以下是我的问题.
Thi*_*nka 21
我对此做了一些研究,发现Nginx在静态资源方面表现不错,而不是像其他动态内容交付一样,例如php处理需要在php-fpm等外部应用程序的帮助下完成.因此,如果您的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吗?"
更长的答案在这里:
jgm*_*jgm 16
尽管有很多人声称它更快,或者应该更快,但不,它不应该更快,至少不是无条件地。
究竟哪个更快,mod_php 还是 ext-fpm,尚未得到证实,而且可能会有所不同。关于性能,您需要考虑三个因素:理论、实现、用例、资源和负载。
理论上,mod_php 是最快的。使用 mod_php,Web 服务器和解释器直接通信,它们共享相同的资源和内存空间。使用 ext-fpm,您有单独的进程,这些进程不能直接通信并且必须复制资源。
传统上独立的过程很受欢迎,因为他们往往有有关的东西了更大的灵活性,如同时运行许多不同的用户,不同的版本,等等。许多人还使用多进程系统,因为他们不能打扰到free(),fclose()等等。
而ext-fpm,使用FastCGI,是为了使分离进程模型达到其最大理论速度的尝试,但最大理论速度仍然比统一进程的最大理论速度慢。
找出哪个最快可能很困难。即使精心编排,其他人的测试也不会可靠,因为它们可能与您的用例和设置无关。在您自己的测试中,您可能使一个比另一个更快,但这并不意味着有人不能出现并改变它。那个人可以成为你,有更多的时间和理解供你使用。
mod_php 的实现不一定会使其达到最大理论速度。这两者可能没有人们预期的那么远,特别是因为与处理静态请求时发生的其他所有事情相比,SAPI 开销经常被证明是微不足道的。许多基准测试必须使用几乎 noop 脚本进行测试,因此差异似乎很重要。
人们普遍认为 ext-fpm “很快”。有许多力量坚持这一点,其中一些是无辜的,另一些来自无能,而另一些则是操纵性的。
通常,当人们看到不同的结果时,他们无法理解原因。他们的过程、测量和流量的私密细节被忽略了。然后人们经常尝试重复这些成功并失败,留下无数的搜索结果,人们问为什么它不更快。最大的问题是人们在使用基于多进程的 MPM 和 mod_php 时取得了成功,同时静态内容负载很重。这些情况尤其具有欺骗性,因为来自静态请求的负载可能会反弹回 PHP。
另一个常见的错误是人们同时测试两种不同的配置。php-fpm 的配置可能比 mod_php 的配置更优化。有时它可以像人们优化他们期望更快的所有内容而忽略原始内容一样简单。这在人们可能会做一些事情时尤其重要,比如不检查请求是否成功,同时还改变了诸如内存限制或最大执行时间之类的事情。当人们只想更改 SAPI 时,配置中的很多事情都可以更改,有时甚至是不可避免的,有时甚至是透明的。一个常见的例子可能是网络服务器的限制可能不足以最大限度地利用服务器' s 资源,其中 ext-fpm 将能够产生额外的进程以利用额外的内核。经常看到人们将诸如从 PHP 路由到 FPM 的网络服务器之类的东西移动。
与具有多进程单线程 MPM 的 mod_php 相比,ext-fpm 是一个很好的竞争者,虽然不能严格保证更高的性能,但它具有很多全面的好处。虽然如果您的负载完全是为 PHP 请求提供服务,那么 Apache 已经更多地减少了 ext-fpm 本来应该做的事情。
延迟与吞吐量、周期与字节与等待等之间也存在差异。
理论上,前进的道路是带有 ngx_php 或 mod_php 的 php-zts。最大的警告是 php-zts 几乎没有像 php-nts 那样得到重视和关注,因此它为 PHP 执行本身带来了开销,这使得目前很难与 php-fpm 竞争。实施并没有将其带入达到最佳状态的领域。在某些情况下,次优可能是轻描淡写。许多人担心线程 PHP 的可靠性,这可能会或可能不会影响您。如果您只提供动态内容而不运行共享托管服务,则肯定不会那么担心。这似乎是 Apache 精心策划的一场恐惧运动。应该有足够多的人将 php-zts 用于平台,因为它是相对稳定的唯一选择。
还有其他选择,尽管他们可能需要更多的动手。甚至可以自己打开一个 Unix 套接字,解析 FCGI 并使用 select 之类的东西异步处理它。PHP 中事件驱动的警告是大多数主要的高级 IO 库(例如 MySQL)不以统一的方式支持它。
php-swoole 虽然还处于早期阶段,但看起来很有希望。php-fpm、mod_php 和 php-zts 的情况是一团糟。
小智 8
我有一个使用 3 台服务器负载平衡运行的网站。其中 2 个使用 PHP-FPM(新的)在 nginx 上运行。然而,主服务器在 Apache + PHP FastCGI 上大约有 40% 的流量。最近想把Apache也换成nginx;所以我在同一台服务器上为不同的 IP 安装了 nginx 并做了一些测试。但令人惊讶的是,Apache 可以在每次点击时在 10-20 毫秒内生成页面,而 nginx 需要 60-70 毫秒。nginx 对于静态文件更快,但如果您有 CDN,则无需担心静态内容。Apache 是一个很棒的服务器。但是尝试 FastCGI 而不是 PHP 模块。