本次测试nginx+php与apache+php哪种组合的计算性能及稳定性更佳
操作系统:Centos6.4 x64
硬件环境:
服务器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),测试程序有两种,分别为算法程序和连接数据库的读写程序。
首先安装环境
这里只讲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 <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 </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
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
四、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
五、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倍左右。