常青树 发表于 2018-11-9 13:43:22

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
  

  
User daemon
  
Group daemon
  

  
ServerAdmin you@example.com
  

  
    AllowOverride none
  
    Require all denied
  

  
DocumentRoot "/alidata/server/httpd/htdocs"
  

  
    Options Indexes FollowSymLinks
  
    AllowOverride None
  
    Require all granted
  

  

  
    DirectoryIndex index.html
  

  

  
    Require all denied
  

  
ErrorLog "logs/error_log"
  
LogLevel warn
  

  
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
  
   
  
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
  
   
  
    CustomLog "logs/access_log" common
  

  

  
    ScriptAlias /cgi-bin/ "/alidata/server/httpd/cgi-bin/"
  

  

  

  

  
    AllowOverride None
  
    Options None
  
    Require all granted
  

  

  
    TypesConfig conf/mime.types
  
    AddType application/x-compress .Z
  
    AddType application/x-gzip .gz .tgz
  
    AddType application/x-httpd-php .php
  

  

  
Include conf/extra/proxy-html.conf
  

  

  
SSLRandomSeed startup builtin
  
SSLRandomSeed connect builtin
  

  4、配置虚拟主机
  Include /alidata/server/httpd/conf/vhosts/*.conf
  
Order allow,deny
  
Deny from all
  

  

  

  

  
      DocumentRoot /alidata/www/phpwind
  
      ServerName localhost
  
      ServerAlias localhost
  
      
  
            Options Indexes FollowSymLinks
  
            Require all granted
  
      
  
      
  
                RewriteEngine On
  
                RewriteRule ^(.*)-htm-(.*)$ .php?
  
                RewriteRule ^(.*)/simple/(+\.html)$ /simple/index.php?
  
      
  
      ErrorLog "/alidata/log/httpd/phpwind-error.log"
  
      CustomLog "/alidata/log/httpd/phpwind.log" common
  

  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;
  
            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.7vsNginx1.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倍左右。


页: [1]
查看完整版本: Web 服务器基准测试,nginx+php vs Apache+php