鑑於論壇裏有會員對NGINX、APACHE各自與各自的方式運行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
在 這裏你能夠看到每一個PHP請求施加的開銷。有趣的的是一個事實是Apache在這個測試執行的更好並且好得多。這裏的緣由是,Apache的PHP「內 置」經過mod_php,而且模塊處理。另外一方面Nginx的代理PHP請求到另外一個應用程序服務器(PHP-FPM)。 Nginx的性能在上面的圖是大約爲apache的一半,容易解釋。這裏的PHP只是簡單輸出字符串。
[font='Lucida Grande', Verdana, Arial, sans-serif]HelloWorld.txt
[font='Lucida Grande', Verdana, Arial, sans-serif]
[font='Lucida Grande', Verdana, Arial, sans-serif]
[font='Lucida Grande', Verdana, Arial, sans-serif]
在本次測試的Apache開始落後。 NGINX的性能超過了apache性能的兩倍。這項測試是展現靜態文件服務的開銷。
[font='Lucida Grande', Verdana, Arial, sans-serif]100KB.txt
[font='Lucida Grande', Verdana, Arial, sans-serif]
[font='Lucida Grande', Verdana, Arial, sans-serif]
在 這裏的測試已經接近生產應用中的靜態文件了(100KB),並且,咱們可以證實,Nginx 禁用keepalive後與Apache 啓用KeepAlive壓力發現NGINX仍優於APACHE約兩倍。這次測試的吞吐量約爲1.2GB/s,可是全部測試均未真正出因特網(測試是在局域 網進行的)。
[font='Lucida Grande', Verdana, Arial, sans-serif]1MB.txt
此次測試沒全部伺服均未開啓keep alive,每一個請求都要新創建鏈接,但相比於數據傳輸,這新建鏈接的開銷就無所謂了。
真正意義上的PHP程序:
或許你會驚奇地看到,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處理。 有會員的疑問:兩個伺服,根本是畫蛇添足。 回答:個人目標是高承載能力 穩定同時兼顧。而不是舍一取一。