本次測試nginx+php與apache+php哪一種組合的計算性能及穩定性更佳php
操做系統:Centos6.4 x64
html
硬件環境:mysql
服務器IP | 硬件配置 | 角色 |
192.168.1.2 | 4核心 8GB | 基準測試服務器 |
192.168.1.3 | 略 | 基準測試客戶端 |
實驗思路:在本次測試中打算採用,同版本組合測試,如(nginx1.4.4+php5.5.7)vs (httpd2.4.2+php5.5.7) 和 (nginx+php7) vs(apache+php7),測試程序有兩種,分別爲算法程序和鏈接數據庫的讀寫程序。nginx
首先安裝環境git
這裏只講Apache的安裝配置nginx配置簡單(略)web
如不熟悉請參考:http://tchuairen.blog.51cto.com/3848118/1437530 算法
1、編譯Apachesql
Apache官網:http://httpd.apache.org/ 數據庫
這裏使用httpd2.4.2 其餘httpd2.4.x系列安裝配置都是差很少的。apache
一、安裝依賴包
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
二、配置編譯選項及安裝
./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
三、修改主配置文件: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 you@example.com <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>
四、配置虛擬主機
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 安裝配置完成
2、編譯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; // 到這裏 } }
修改完成以後,照常編譯就行了。
3、開始壓測
程序環境: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
Nginx1.4.4+php5.5.7
下面分別是五次每秒處理請求數的測試結果:
2065.52
2083.04
2026.32
2063.60
1995.74
平均值:2046
平均失敗請求數:0
./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
Nginx1.4.4+php5.5.7
下面分別是五次每秒處理請求數的測試結果:
1513.51
1913.67
1719.01
1619.77
2018.31
平均值:1756
平均失敗請求數:25
./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
Nginx1.4.4+php5.5.7
下面分別是五次每秒處理請求數的測試結果:
1816.49
1689.54
1677.48
2033.39
1790.44
平均值:1801
平均失敗請求數:213
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
Nginx1.4.4+php5.5.7
WebBench測試算法程序
Apache2.4.2+php5.5.7
Nginx1.4.4+php5.5.7
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
4、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
./ab -c 1000 -n 200000 10.117.64.176/mysql.php
下面分別是五次每秒處理請求數的測試結果:
1678.28
1931.22
1546.89
1791.62
1720.07
平均值:1733
平均失敗請求數:776
5、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
Nginx1.4.4+php7 讀取數據庫性能測試
下面分別是五次每秒處理請求數的測試結果:
2492.27
2497.95
2646.73
1937.65
1635.76
平均值:2242
平均失敗請求數:19
./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
壓測Nginx1.4.4+php7
下面分別是五次每秒處理請求數的測試結果:
2346.19
1868.92
2134.17
2272.42
1847.33
平均值:2093
平均失敗請求數:191
Apache2.4.2+php7 算法程序性能測試
下面分別是五次每秒處理請求數的測試結果:
45.53
45.52
45.54
45.52
45.52
平均值:45
平均失敗請求數:0
Nginx1.4.4+php7 算法程序性能測試
下面分別是五次每秒處理請求數的測試結果:
53.99
53.98
53.95
53.96
53.97
平均值:53
平均失敗請求數:0
今後咱們能夠看出,其實Apache+PHP 和 Nginx+PHP 這兩種組合在性能上並無很大的差異,你們能夠根據自身業務靈活使用便可。 不過 PHP7 確實要比 PHP5 在計算性能上高出3倍左右。