APACHE+PHP vs NGINX+PHP 性能評測(譯文)

鑑於論壇裏有會員對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處理。      有會員的疑問:兩個伺服,根本是畫蛇添足。  回答:個人目標是高承載能力 穩定同時兼顧。而不是舍一取一。
相關文章
相關標籤/搜索