全球主机交流论坛

标题: APACHE+PHP vs NGINX+PHP 性能评测(译文) [打印本页]

作者: 360安全卫士    时间: 2012-8-12 20:38
标题: APACHE+PHP vs NGINX+PHP 性能评测(译文)



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

所有的软件均从源码编译(详见如下)。压测工具使用APACHE的ApacheBench(ab),下面的结果是在同一台机器上测试的,所有伺服系统(nginx、apache)均关闭了日志功能(防止对性能的影响),测试过程中keepalive配置的是一次启用、一次禁用,每样测试均测试5遍,然后取得的平均值。测试的文件如下:

HelloWorld.php – 简短的输出“Hello, World!” (13 bytes)的PHP脚本,用来代表PHP文件测试处理过程的开销,相比的静态文件在下面
HelloWorld.txt – 一个静态文件,输出“Hello, World!”  (同样13 bytes),用来代表静态文件测试处理过程的开销
100KB.txt – 一个静态的100KB大小的文件
1MB.txt –  一个静态的1MB 大小的文件
index.php – 一个包含多重复杂的处理过程的PHP文件,包括数据库查询、文件缓存读取、模板[编译]处理。

硬件环境
硬件: HP DL380 G5
硬件CPU: 2x Intel Xeon E5420 (4 cores each, total of 8 cores)
硬件内存: 8GB of ECC RAM
硬件磁盘: Smart Array P400i RAID-1 with 2x 147GB SAS drives
操作系统: Slackware 12.2 with almost all software compiled from source
文件系统: ext3
Apache 版本: 2.2.11, php 由mod_php方式运行
Nginx 版本: 0.7.59, php 由 php-fpm (通过socket方式运行)
PHP 版本: 5.2.9
Eaccelerator 版本: 0.9.5.3 (for both, Apache and Nginx)
MySQL 版本: 5.0.77
OpenSSL 版本: 0.9.8k
服务日志、请求日志均已禁用
Apache编译选项:

./configure –prefix=/usr/local/$PDESTDIR_HTTPD –sysconfdir=/etc/httpd \
–enable-authn-file –enable-authn-default \
–enable-authz-host –disable-authz-groupfile –enable-authz-user –enable-authz-default \
–enable-auth-basic \
–disable-include –disable-filter –disable-charset-lite \
–enable-log-config \
–enable-env –enable-setenvif \
–enable-ssl –with-ssl=/usr/local/openssl-$PVERSION_OPENSSL \
–enable-http –enable-mime –enable-status \
–disable-autoindex –disable-asis \
–enable-info \
–enable-cgi –disable-cgid \
–enable-vhost-alias \
–disable-negotiation \
–enable-dir \
–disable-actions \
–disable-userdir \
–enable-info \
–enable-rewrite \
–enable-so \
–with-mpm=prefork

Nginx编译选项:

./configure –prefix=/usr/local/$PDIR \
–conf-path=/etc/nginx/nginx.conf \
–error-log-path=/var/log/nginx/nginx_error.log \
–pid-path=/var/run/nginx.pid \
–lock-path=/var/run/nginx.lock \
–user=httpd \
–group=httpd \
–with-openssl=/usr/local/openssl-0.9.8k

PHP编译选项(与APACHE一起运行的MOD_PHP):

—–[These lines are for PHP with Apache (mod_php)]—————-
./configure –prefix=/usr/local/$PDESTDIR_HTTPD/$PDIR \
–with-apxs2=/usr/local/$PDESTDIR_HTTPD/bin/apxs –enable-cli –enable-cgi \
–with-config-file-path=/etc/php/httpd \

与NGINX一起运行的(php-fpm)
—–[These lines are for PHP with Nginx (php-fpm)]—————-
./configure –prefix=/usr/local/php-fpm \
–enable-cli –enable-fastcgi –enable-fpm \
–with-fpm-conf=/etc/php/php-fpm/php-fpm.conf \
–with-fpm-log=/var/log/php-fpm.log \
–with-fpm-pid=/var/run/php-fpm.pid \
–with-config-file-path=/etc/php/php-fpm \

PHP共同配置
—–[These lines are common for both]—————-
–disable-short-tags \
–disable-ipv6 \
–disable-all \
\
–enable-libxml \
–with-openssl=/usr/local/openssl-$PVERSION_OPENSSL \
–with-pcre-regex \
–with-zlib \
–with-bz2 \
–with-curl –with-curlwrappers \
–enable-dba=shared –with-db4 –enable-inifile –enable-flatfile \
–enable-dom –with-libxml-dir \
–enable-filter \
–enable-ftp \
–with-gd –with-jpeg-dir –with-png-dir –with-freetype-dir \
–with-gettext \
–enable-hash –with-mcrypt \
–with-iconv=/usr/local/lib –with-iconv-dir=/usr/local/lib \
–with-imap=/usr/local/imap-$PVERSION_CYRUSIMAP –with-imap-ssl \
–enable-json \
–enable-mbstring –enable-mbregex –enable-mbregex-backtrack \
–with-mysql=/usr/local/mysql-$PVERSION_MYSQL –with-mysqli=/usr/local/mysql-$PVERSION_MYSQL/bin/mysql_config \
–enable-pdo –with-pdo-mysql=/usr/local/mysql-$PVERSION_MYSQL –with-pdo-sqlite –enable-sqlite-utf8 \
–enable-reflection \
–enable-session –with-mm \
–enable-shmop \
–enable-simplexml \
–enable-soap \
–enable-sockets \
–enable-spl \
–with-regex \
–enable-sysvmsg –enable-sysvsem –enable-sysvshm \
–enable-tokenizer \
–enable-xml –enable-xmlreader –with-xmlrpc –enable-xmlwriter –with-xsl \
–enable-zip \
\
–with-pear \
–enable-zend-multibyte


配置文档:



Apache mod_php: httpd.conf http://blog.a2o.si/wp-content/uploads/2009/06/httpd.conf.txt
Apache mod_php: php.ini http://blog.a2o.si/wp-content/uploads/2009/06/php.ini.txt
Nginx php-fpm: nginx.conf http://blog.a2o.si/wp-content/uploads/2009/06/nginx.conf.txt
Nginx php-fpm: php-fpm.conf http://blog.a2o.si/wp-content/uploads/2009/06/php-fpm.conf.txt
Nginx php-fpm: php.ini与mod_php方式相同


测试结果:
HelloWorld.php

(, 下载次数: 0)


在这里你可以看到每个PHP请求施加的开销。有趣的的是一个事实是Apache在这个测试执行的更好而且好得多。这里的原因是,Apache的PHP“内置”通过mod_php,并且模块处理。另一方面Nginx的代理PHP请求到另一个应用程序服务器(PHP-FPM)。 Nginx的性能在上面的图是大约为apache的一半,容易解释。这里的PHP只是简单输出字符串。


HelloWorld.txt

(, 下载次数: 0)

在本次测试的Apache开始落后。 NGINX的性能超过了apache性能的两倍。这项测试是展示静态文件服务的开销。


100KB.txt

(, 下载次数: 0)

在这里的测试已经接近生产应用中的静态文件了(100KB),而且,我们能够证明,Nginx 禁用keepalive后与Apache 启用KeepAlive压力发现NGINX仍优于APACHE约两倍。此次测试的吞吐量约为1.2GB/s,但是所有测试均未真正出因特网(测试是在局域网进行的)。


1MB.txt

(, 下载次数: 0)

这次测试没所有伺服均未开启keep alive,每个请求都要新建立连接,但相比于数据传输,这新建连接的开销就无所谓了。




真正意义上的PHP程序:

(, 下载次数: 0)

或许你会惊奇地看到,apache跑真实的、复杂点的PHP程序的时候,性能不及NGINX。
但原文作者或许没有注意到,NGINX PHP这时执行的时候肯定有不少是弹了回错误了的(而且作者没开启日志,测试过后没查证)
作者在原文只是这样说到:
apache开启.htaccess(NGINX没有这个功能)过后,会导致连接数据库的性能有所下降。


后面还有两项测试(分别是比较APACHE自己处理静态与自己处理动态的能力和NGINX的能力。)我就不在这里翻译了。




总结:
APACHE处理静态的能力不及NGINX,但NGINX处理PHP的稳定性不及apache mod_php。


如果取长补短哩?
NGINX做前端,APACHE做后端。NGINX proxy_pass apache,然后两个伺服doc_root配成一致,并让静态文件直接让NGINX输出,只转发PHP的请求给后端apache处理。

作者: kwx    时间: 2012-8-12 20:39
求送阿里云永久。
作者: 360安全卫士    时间: 2012-8-12 20:40
kwx 发表于 2012-8-12 20:39
求送阿里云永久。

这个估计马云自己都没有
作者: smyz    时间: 2012-8-12 20:41
nginx 没错的。
作者: 单手摘月    时间: 2012-8-12 20:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: taian    时间: 2012-8-12 20:47
同球永久
作者: 360安全卫士    时间: 2012-8-12 20:48
taian 发表于 2012-8-12 20:47
同球永久


作者: msputup    时间: 2012-8-12 20:49
顶的是不是就有永久 ?
作者: 过客    时间: 2012-8-12 20:50
中小型网站可以对本评测无视。
作者: 360安全卫士    时间: 2012-8-12 20:50
msputup 发表于 2012-8-12 20:49
顶的是不是就有永久 ?

同求啊
作者: 小夜    时间: 2012-8-12 20:54
好吧,那我求阿里云年付赞助。
作者: zhang3china    时间: 2012-8-12 20:55
求送阿里云永久
作者: 360安全卫士    时间: 2012-8-12 20:55
小夜 发表于 2012-8-12 20:54
好吧,那我求阿里云年付赞助。

多在论坛看看,经常有活动的。
作者: 360安全卫士    时间: 2012-8-12 20:56
zhang3china 发表于 2012-8-12 20:55
求送阿里云永久

。。。。
作者: 大胡子    时间: 2012-8-12 20:58
纠结。。
作者: 360安全卫士    时间: 2012-8-12 20:59
大胡子 发表于 2012-8-12 20:58
纠结。。

亲,马上点签名,黑丝MM24小时听你的召唤
作者: hejin088    时间: 2012-8-12 21:00
大胡子 发表于 2012-8-12 20:58
纠结。。

大胡子加分,360说的功能MAPN应该能实现吧
作者: 大胡子    时间: 2012-8-12 21:00
点了很多次  求一年免费试用
作者: 360安全卫士    时间: 2012-8-12 21:01
呃,,,最后20分加错了,楼上的楼上MJJ
作者: 360安全卫士    时间: 2012-8-12 21:01
大胡子 发表于 2012-8-12 21:00
点了很多次  求一年免费试用

我只是扫地的
作者: 大胡子    时间: 2012-8-12 21:03
http://www.codinglabs.org/html/nginx-memc-and-srcache.html

求研究这个

自己测试了下 刚开始压力测试 负载上来 但是一会之后 负载下去 降到0  但是所有页面都是一个页面

直接请求负载会不断攀升

似乎是配置不对

作者: 大胡子    时间: 2012-8-12 21:03
360安全卫士 发表于 2012-8-12 21:01
我只是扫地的

求带扫地 我也要扫地
作者: 360安全卫士    时间: 2012-8-12 21:04
大胡子 发表于 2012-8-12 21:03
http://www.codinglabs.org/html/nginx-memc-and-srcache.html

求研究这个

我对memcached没多大的好感,因为连密码都不用,太不安全了。。
作者: 大胡子    时间: 2012-8-12 21:05
360安全卫士 发表于 2012-8-12 21:04
我对memcached没多大的好感,因为连密码都不用,太不安全了。。

cc多了似乎会出这毛病 不好解决 那用什么?  改装成apc如何?
作者: 360安全卫士    时间: 2012-8-12 21:06
大胡子 发表于 2012-8-12 21:05
cc多了似乎会出这毛病 不好解决 那用什么?  改装成apc如何?

nginx + tmpfs,高速前端技术,整页缓存,控制KEY,无视小量CC
作者: 大胡子    时间: 2012-8-12 21:08
360安全卫士 发表于 2012-8-12 21:06
nginx + tmpfs,高速前端技术,整页缓存,控制KEY,无视小量CC

多个前端?? 那谁跑php
作者: 360安全卫士    时间: 2012-8-12 21:10
大胡子 发表于 2012-8-12 21:08
多个前端?? 那谁跑php

PHP和apache一起跑,用我发帖所说的技术来把未命中缓存的PHP转发给APACHE。

作者: hejin088    时间: 2012-8-12 21:13
360安全卫士 发表于 2012-8-12 21:01
呃,,,最后20分加错了,楼上的楼上MJJ

MJJ啊,加就加了,你还说加错了,我等会叫365来咬你。
作者: 大胡子    时间: 2012-8-12 21:13
360安全卫士 发表于 2012-8-12 21:10
PHP和apache一起跑,用我发帖所说的技术来把未命中缓存的PHP转发给APACHE。

这么太累了。。。网站没流量 还是先不折腾了

apc是内存缓存吗
作者: 360安全卫士    时间: 2012-8-12 21:14
大胡子 发表于 2012-8-12 21:13
这么太累了。。。网站没流量 还是先不折腾了

apc是内存缓存吗

操作起来不累的。一劳永逸
不懂啥是APC
作者: 大胡子    时间: 2012-8-12 21:17
360安全卫士 发表于 2012-8-12 21:14
操作起来不累的。一劳永逸
不懂啥是APC

php-apc
作者: 大胡子    时间: 2012-8-12 21:18
360安全卫士 发表于 2012-8-12 21:10
PHP和apache一起跑,用我发帖所说的技术来把未命中缓存的PHP转发给APACHE。

不知道 discuz 对php5.4.x兼容如何 http://eaccelerator.net/

好像很牛逼的样子
作者: 360安全卫士    时间: 2012-8-12 21:19
大胡子 发表于 2012-8-12 21:17
php-apc

PHP不关缓存的事,缓存是NGINX直接从内存TMPFS里调取的,连磁盘IO都不用,根本没达到PHP、APACHE就直接响应请求了。
作者: 360安全卫士    时间: 2012-8-12 21:20
大胡子 发表于 2012-8-12 21:18
不知道 discuz 对php5.4.x兼容如何 http://eaccelerator.net/

好像很牛逼的样子

亲,俺给你出个需求,
你做个一键包,发到阿里云论坛上,加上你自己的署名信息,
阿里云给你的奖励大大的有
作者: osiris    时间: 2012-8-12 21:23
这个不测试都知道
作者: Zeraba    时间: 2012-8-12 21:39
网站设置缓存 多为nginx输出 后端的apache是大爷~ 嘎嘎 正在向这个方向前进
作者: 大胡子    时间: 2012-8-12 21:39
360安全卫士 发表于 2012-8-12 21:20
亲,俺给你出个需求,
你做个一键包,发到阿里云论坛上,加上你自己的署名信息,
阿里云给你的奖励 ...

真的吗  要在阿里云更新吗 独家?
作者: Zeraba    时间: 2012-8-12 21:40
360安全卫士 发表于 2012-8-12 21:20
亲,俺给你出个需求,
你做个一键包,发到阿里云论坛上,加上你自己的署名信息,
阿里云给你的奖励 ...

目测没我的份
作者: 360安全卫士    时间: 2012-8-12 21:42
Zeraba 发表于 2012-8-12 21:40
目测没我的份






欢迎光临 全球主机交流论坛 (https://lilynana.eu.org/) Powered by Discuz! X3.4