Web 服務器基準測試,nginx+php vs Apache+php

本次測試nginx+php與apache+php哪種組合的計算性能及穩定性更佳


操作系統:Centos6.4 x64

硬件環境:

  


服務器IP硬件配置角色
192.168.1.24核心 8GB基準測試服務器
192.168.1.3基準測試客戶端


實驗思路:在本次測試中打算採用,同版本組合測試,如(nginx1.4.4+php5.5.7)vs (httpd2.4.2+php5.5.7) 和 (nginx+php7) vs(apache+php7),測試程序有兩種,分別爲算法程序和連接數據庫的讀寫程序。


首先安裝環境

這裏只講Apache的安裝配置nginx配置簡單(略)

如不熟悉請參考:http://tchuairen.blog.51cto.com/3848118/1437530


一、編譯Apache

Apache官網:http://httpd.apache.org/

這裏使用httpd2.4.2 其他httpd2.4.x系列安裝配置都是差不多的。


1、安裝依賴包

tar -zxvf apr-1.5.0.tar.gz
cp -rf apr-1.5.0 httpd-2.4.2/srclib/apr

tar -zxvf apr-util-1.5.3.tar.gz
cp -rf apr-util-1.5.3 httpd-2.4.2/srclib/apr-util


2、配置編譯選項及安裝

./configure --prefix=/alidata/server/httpd \
--with-mpm=prefork \
--enable-so \
--enable-rewrite \
--enable-mods-shared=all \
--enable-nonportable-atomics=yes \
--disable-dav \
--enable-deflate \
--enable-cache \
--enable-disk-cache \
--enable-mem-cache \
--enable-file-cache \
--enable-ssl \
--with-included-apr \
--enable-modules=all  \
--enable-mpm-shared=all

make -j 4
make install
# 提供啓動腳本
cp support/apachectl /etc/init.d/httpd 
chmod u+x /etc/init.d/httpd

部分編譯參數詳解:


定義默認使用的mpm模式

--with-mpm=prefork


安裝所有的mpm模塊

--enable-mpm-shared=all


3、修改主配置文件:httpd.conf

ServerRoot "/alidata/server/httpd"
Listen 80
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule php5_module modules/libphp5.so
<IfModule unixd_module>
User daemon
Group daemon
</IfModule>
ServerAdmin [email protected]
<Directory />
    AllowOverride none
    Require all denied
</Directory>
DocumentRoot "/alidata/server/httpd/htdocs"
<Directory "/alidata/server/httpd/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
<Files ".ht*">
    Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" common
</IfModule>
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/alidata/server/httpd/cgi-bin/"
</IfModule>
<IfModule cgid_module>
</IfModule>
<Directory "/alidata/server/httpd/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>
<IfModule mime_module>
    TypesConfig conf/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType application/x-httpd-php .php
</IfModule>
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

4、配置虛擬主機

Include /alidata/server/httpd/conf/vhosts/*.conf

<Files ~ ".php">
Order allow,deny
Deny from all
</Files>
</DirectoryMatch>

<VirtualHost *:8081>
        DocumentRoot /alidata/www/phpwind
        ServerName localhost
        ServerAlias localhost
        <Directory "/alidata/www/phpwind">
            Options Indexes FollowSymLinks
            Require all granted
        </Directory>
        <IfModule mod_rewrite.c>
                RewriteEngine On
                RewriteRule ^(.*)-htm-(.*)$ .php?
                RewriteRule ^(.*)/simple/([a-z0-9\_]+\.html)$ /simple/index.php?
        </IfModule>
        ErrorLog "/alidata/log/httpd/phpwind-error.log"
        CustomLog "/alidata/log/httpd/phpwind.log" common
</VirtualHost>


Apache 安裝配置完成


二、編譯PHP5.5.7

./configure --prefix=/alidata/server/php-Apache \
--enable-opcache \
--with-config-file-path=/alidata/server/php-Apache/etc \
--with-apxs2=/alidata/server/httpd/bin/apxs \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-static \
--enable-maintainer-zts \
--enable-zend-multibyte \
--enable-inline-optimization \
--enable-sockets \
--enable-wddx \
--enable-zip \
--enable-calendar \
--enable-bcmath \
--enable-soap \
--with-zlib \
--with-iconv \
--with-gd \
--with-xmlrpc \
--enable-mbstring \
--without-sqlite \
--with-curl \
--enable-ftp \
--with-mcrypt  \
--with-freetype-dir=/usr/local/freetype.2.1.10 \
--with-jpeg-dir=/usr/local/jpeg.6 \
--with-png-dir=/usr/local/libpng.1.2.50 \
--disable-ipv6 \
--disable-debug \
--with-openssl \
--disable-maintainer-zts \
--disable-safe-mode \
--disable-fileinfo

如果編譯工作模式爲work,或event,則在編譯PHP的時候要加上 --enable-maintainer-zts,因爲這兩種模式是基於線程工作的。

make ZEND_EXTRA_LIBS='-liconv' -j 4

make install

提供php.ini文件

cp ./php-5.5.7/php.ini-production /alidata/server/php-Apache/etc/php.ini

php安裝配置完成


準備壓測工具


這裏採用3個壓測工具ab、WebBench、Siege 分別進行測試。

 

siege使用詳解:http://www.ha97.com/4663.html

其他壓測工具使用詳解:http://www.cnblogs.com/EthanCai/archive/2014/05/11/3721656.html  

Apache配置文件詳解:http://blief.blog.51cto.com/6170059/1672955


下面是安裝相關壓測工具的腳本代碼:

#!/bin/bash

# Install siege
wget http://download.joedog.org/siege/siege-3.1.4.tar.gz
tar -xzvf siege-3.1.4.tar.gz
cd siege-3.1.4
./configure
make && make install

# Install WebBench
wget http://www.ha97.com/code/webbench-1.5.tar.gz
tar zxvf webbench-1.5.tar.gz
cd webbench-1.5
make
make install

ab的安裝比較特別,因爲默認用rpm包安裝的ab有併發限制,所以這裏要重新編譯ab。


找到Apache源碼目錄下support/ab.c文件,到1380行修改如下:

/* catch legitimate fatal apr_socket_recv errors */  
else if (status != APR_SUCCESS) {  
    err_recv++;  
    if (recverrok) {  
        bad++;  
        close_connection(c);  
        if (verbosity >= 1) {  
            char buf[120];  
            fprintf(stderr,"%s: %s (%d)\n", "apr_socket_recv", apr_strerror(status, buf, sizeof buf), status);  
        }  
        return;  
    } else {  
        //apr_err("apr_socket_recv", status);   // 從這開始  
        bad++;  
        close_connection(c);  
        return;      // 到這裏  
    }  
}

修改完成之後,照常編譯就好了。


三、開始壓測


程序環境:Apache2.4.2+php5.5.7  vs  Nginx1.4.4+php5.5.7

Ab測試數據庫讀寫程序

./ab -c 200 -n 40000 10.117.64.176/mysql.php



Apache2.4.2+php5.5.7  

下面分別是五次每秒處理請求數的測試結果:

1867.58

2185.96

2034.68

1825.54

1842.52


平均值:1951

平均失敗請求數:0

wKioL1bQF1PCRSIFAABhDvUlGtE271.png



Nginx1.4.4+php5.5.7

下面分別是五次每秒處理請求數的測試結果:

2065.52

2083.04

2026.32

2063.60

1995.74


平均值:2046

平均失敗請求數:0

wKioL1bQF2bRwBzfAABmfCCRIgU661.png


./ab -c 500 -n 100000 10.117.64.176/mysql.php


Apache2.4.2+php5.5.7

下面分別是五次每秒處理請求數的測試結果:

2104.55

2071.86

2146.81

1984.53

1985.45


平均值:2058

平均失敗請求數:0

wKioL1bQGN2zC_LBAABmLfw6sts241.png


Nginx1.4.4+php5.5.7

下面分別是五次每秒處理請求數的測試結果:

1513.51

1913.67

1719.01

1619.77

2018.31


平均值:1756

平均失敗請求數:25

wKiom1bQGIHC5MVRAABna-D2nlM458.png


./ab -c 1000 -n 200000 10.117.64.176/mysql.php


Apache2.4.2+php5.5.7

下面分別是五次每秒處理請求數的測試結果:

1871.87

1609.17

1986.52

1851.46

1877.55


平均值:1839

平均失敗請求數:849

wKiom1bTC0bzDIUpAABzW840c1s496.png


Nginx1.4.4+php5.5.7

下面分別是五次每秒處理請求數的測試結果:

1816.49

1689.54

1677.48

2033.39

1790.44


平均值:1801

平均失敗請求數:213

wKioL1bTC9rhGfJ2AABqvBMfn0M743.png


Ab測試算法程序


./ab -c 100-n 20000.117.64.176/arr.php


Apache2.4.2+php5.5.7


平均值:13.83

平均失敗請求數:0



Nginx1.4.4+php5.5.7


平均值:14

平均失敗請求數:30


WebBench測試數據庫讀寫程序


Apache2.4.2+php5.5.7

wKioL1bTxGjQbr3xAAByzaSUiiE247.png


Nginx1.4.4+php5.5.7

wKioL1bTwmmyQIhIAAB63Wm9l7c508.png


WebBench測試算法程序


Apache2.4.2+php5.5.7

wKioL1bTxlORKODIAAB12tldnpw757.png


Nginx1.4.4+php5.5.7

wKioL1bTxKrwT380AABynnJk3B4827.png


siege混合鏈接測試


Apache2.4.2+php5.5.7

Transactions:		       21192 hits
Availability:		       95.36 %
Elapsed time:		      503.23 secs
Data transferred:	      473.91 MB
Response time:		        2.62 secs
Transaction rate:	       42.11 trans/sec
Throughput:		        0.94 MB/sec
Concurrency:		      110.21
Successful transactions:       21192
Failed transactions:	        1031
Longest transaction:	       16.24
Shortest transaction:	        0.00


Nginx1.4.4+php5.5.7

Transactions:		       18922 hits
Availability:		       94.85 %
Elapsed time:		      453.87 secs
Data transferred:	      102.05 MB
Response time:		        3.05 secs
Transaction rate:	       41.69 trans/sec
Throughput:		        0.22 MB/sec
Concurrency:		      127.28
Successful transactions:       18922
Failed transactions:	        1028
Longest transaction:	       18.40
Shortest transaction:	        0.00


四、Apache的Event工作模型

prefork和mpm方式在非常繁忙的服務器應用下都有些不足。儘管HTTP的Keepalive方式能減少TCP連接數量和網絡負載,但是 Keepalive需要和服務進程或者線程綁定,

這就導致一個繁忙的服務器會耗光所有的線程。 Event MPM是解決這個問題的一種新模型,它把服務進程從連接中分離出來。在服務器處理速度很快,同時具有非常高的點擊

率時,可用的線程數量就是關鍵的資源限 制,此時Event MPM方式是最有效的。一個以Worker MPM方式工作的繁忙服務器能夠承受每秒好幾萬次的訪問量(例如在大型新聞服務站點的高峯時),而Event MPM可以用來處理更高負載。值得注意的是,Event MPM不能在安全HTTP(HTTPS)訪問下工作。

event和work有相同之處,都是通過線程來處理請求;一個父進程建立多個子進程,而子進程又會建立多個線程。


壓測 Apache2.4.2 Event +php5.5.7

./ab -c 500 -n 100000 10.117.64.176/mysql.php

下面分別是五次每秒處理請求數的測試結果:

2381.76

2413.55

2318.26

2388.66

2461.83


平均值:2392

平均失敗請求數:237

wKioL1bUBd3SX_8vAABl89r_txU677.png


./ab -c 1000 -n 200000 10.117.64.176/mysql.php

下面分別是五次每秒處理請求數的測試結果:

1678.28

1931.22

1546.89

1791.62

1720.07


平均值:1733

平均失敗請求數:776

wKioL1bUD6jQzWDXAABz5-i8pF0874.png


wKioL1bUGX-Cmld5AABnELvbUsA012.png


五、PHP7 新特性

PHP7 修復了大量 BUG ,新增了功能和語法糖。這些改動涉及到了核心包、GD庫、PDO、ZIP、ZLIB 等熟悉和不熟悉的核心功能與擴展包。


PHP7 移除了已經被廢棄的函數,如 mysql_ 系列函數在 PHP5.5 被廢棄,在 PHP7被刪除。

性能改善: 

PHP 7 高達兩倍快的 PHP 5.6

顯著減少內存使用

抽象語法樹

一致的 64 位支持

改進的異常層次結構

許多轉化爲異常致命錯誤

安全隨機數發生器

刪除舊的和不支持的 SAPIs 和擴展

空合併運算符(?)

返回和標量類型聲明

匿名類

零成本斷言


編譯安裝PHP 7

./configure --prefix=/usr/local/php7 --enable-fpm --with-zlib --enable-mbstring --with-openssl --with-mysql --with-mysqli --with-mysql-sock --with-gd --enable-gd-native-ttf  --enable-pdo --with-pdo-mysql --with-gettext --with-curl --with-pdo-mysql --enable-sockets --enable-bcmath --enable-xml --with-bz2 --enable-zip

make && make install


./ab -c 500 -n 100000 10.117.64.176:8081/mysql.php

壓測 Apache2.4.2+php7

下面分別是五次每秒處理請求數的測試結果:

2028.29

2336.16

2132.38

1777.49

1151.25


平均值:1885

平均失敗請求數:37

wKioL1bVGjuDQGZkAABqjltHJdU359.png


Nginx1.4.4+php7 讀取數據庫性能測試

下面分別是五次每秒處理請求數的測試結果:

2492.27

2497.95

2646.73

1937.65

1635.76


平均值:2242

平均失敗請求數:19

wKioL1bVA_mSbz29AABpr1BsvIE486.png


./ab -c 1000 -n 200000 10.117.64.176:8081/mysql.php


Apache2.4.2+php7 讀取數據庫性能測試

下面分別是五次每秒處理請求數的測試結果:

2170.86

1584.38

1614.59

1640.35

1641.81


平均值:1730

平均失敗請求數:723

wKioL1bVKq3woe1AAABoLfBsMzc064.png


壓測Nginx1.4.4+php7

下面分別是五次每秒處理請求數的測試結果:

2346.19

1868.92

2134.17

2272.42

1847.33


平均值:2093

平均失敗請求數:191

wKioL1bU_3ijsHaVAABtIVN-lbk067.png


Apache2.4.2+php7 算法程序性能測試

下面分別是五次每秒處理請求數的測試結果:

45.53

45.52

45.54

45.52

45.52

平均值:45

平均失敗請求數:0

wKiom1bVOWrj-9I6AABlUq91Pk4472.png


Nginx1.4.4+php7 算法程序性能測試

下面分別是五次每秒處理請求數的測試結果:

53.99

53.98

53.95

53.96

53.97


平均值:53

平均失敗請求數:0

wKioL1bVB86TPtWNAABlUn69SEQ473.png


從此我們可以看出,其實Apache+PHP 和 Nginx+PHP 這兩種組合在性能上並沒有很大的差別,大家可以根據自身業務靈活使用即可。 不過 PHP7 確實要比 PHP5 在計算性能上高出3倍左右。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章