• 互联网创业的准备——web server:apache、nginx、lighttpd与php module、fastcgi


    测试环境:

    vr.org 的 VPS

    CPU:2核共享

    内存:512M独立

    OS:Ubuntu 12.04 LTS x64

    uname -a
    u1@www:~$ cat /etc/lsb-release 
    DISTRIB_ID=Ubuntu
    DISTRIB_RELEASE=12.04
    DISTRIB_CODENAME=precise
    DISTRIB_DESCRIPTION="Ubuntu 12.04 LTS"
    u1@www:~$ uname -a
    Linux www.shaixuan.org 3.4.0-cloud #1 SMP Thu May 24 04:54:53 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
    u1@www:~$ top
    
    top - 23:57:39 up  1:38,  2 users,  load average: 0.04, 0.03, 0.16
    Tasks:  55 total,   1 running,  54 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.7%us,  0.4%sy,  0.0%ni, 97.6%id,  0.1%wa,  0.0%hi,  0.1%si,  1.1%st
    Mem:    506764k total,   125264k used,   381500k free,     7736k buffers
    Swap:   499708k total,        0k used,   499708k free,    70096k cached

    软件版本:Apache httpd 2.4.3、nginx 1.2.3、lighttpd 1.4.31、php 5.4.6

    结论:

    静态服务器:

    并发:nginx(17000)> lighttpd(14000)> apache(5000)

    注意:lighttpd开启gzip压缩时,无法禁用etag……不建议使用。参考:《高性能网站建设指南》

    动态服务器:

    大约并发:nginx + php-fpm(1500)> lighttpd + spawn-fcgi(1000)>apache + php module(400)

    注意:web server与fastcgi在同一个机器时,建议使用unix domain socket,比tcp socket效果好一点点。

    虽然apache httpd 2.4 像 nginx一样使用了epoll,但是性能还是比nginx低很多。

    服务器OS一定要使用Linux 2.6内核及更高,因为才能支持epoll。

    建议服务器使用Ubuntu server LTS x64,因为工程师PC使用Ubuntu x64较多(Ubuntu的显卡驱动安装方便),这样编译部署都一致。

    Ubuntu、CentOS等各个Linux发行版对服务器来说没有区别,内核都一样,挑一个顺手的即可。

    参考互联网公司的web server:

    163.com 静态nginx
    t.qq.com 静态squid,动态nginx
    taobao.com 静态Tengine,动态Tengine(nginx衍生版)
    小米论坛 静态Tengine,动态Tengine
    百度 静态lighttpd,动态lighttpd(有etag)

    测试过程:

    Apache httpd 2.4.3

    编译参数:

    apache
    ./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --with-pcre=/home/u1/pcre-8.30 --enable-so --enable-rewrite --enable-deflate --with-module=metadata:expires 

    MPM:默认event

    httpd -V
    root@www:/usr/local/apache2/bin# ./httpd -V
    Server version: Apache/2.4.3 (Unix)
    Server built:   Aug 26 2012 10:27:04
    Server's Module Magic Number: 20120211:6
    Server loaded:  APR 1.4.6, APR-UTIL 1.4.1
    Compiled using: APR 1.4.6, APR-UTIL 1.4.1
    Architecture:   64-bit
    Server MPM:     event
      threaded:     yes (fixed thread count)
        forked:     yes (variable process count)
    Server compiled with....
     -D APR_HAS_SENDFILE
     -D APR_HAS_MMAP
     -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
     -D APR_USE_SYSVSEM_SERIALIZE
     -D APR_USE_PTHREAD_SERIALIZE
     -D APR_HAS_OTHER_CHILD
     -D AP_HAVE_RELIABLE_PIPED_LOGS
     -D DYNAMIC_MODULE_LIMIT=256
     -D HTTPD_ROOT="/usr/local/apache2"
     -D SUEXEC_BIN="/usr/local/apache2/bin/suexec"
     -D DEFAULT_PIDLOG="logs/httpd.pid"
     -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
     -D DEFAULT_ERRORLOG="logs/error_log"
     -D AP_TYPES_CONFIG_FILE="conf/mime.types"
     -D SERVER_CONFIG_FILE="conf/httpd.conf"

    默认并发400,MaxRequestWorkers即以前的MaxClients,参考:http://httpd.apache.org/docs/2.4/mod/mpm_common.html#MaxRequestWorkers

    <IfModule mpm_event_module>
        StartServers             3   
        MinSpareThreads         75  
        MaxSpareThreads        250 
        ThreadsPerChild         25  
        MaxRequestWorkers      400 
        MaxConnectionsPerChild   0   
    </IfModule>

    并发改成40000,提示错误,加上ServerLimit即可:

    u1@www:~$ sudo vi /usr/local/apache2/conf/extra/httpd-mpm.conf 
    u1@www:~$ sudo vi /usr/local/apache2/conf/httpd.conf
    u1@www:~$ sudo /etc/init.d/apache2 restart
    AH00515: WARNING: MaxRequestWorkers of 40000 would require 1600 servers and 
     would exceed ServerLimit of 16, decreasing to 400.
     To increase, please see the ServerLimit directive.

    nginx 1.2.3:

    编译参数:

    View Code
    ./configure --prefix=/usr/local/nginx --with-pcre=/usr/local/pcre

    lighttpd 1.4.31:

    默认并发1024,server.max-fds最大可修改为65535,server.max-connections最大可修改为32767:

    193 ##
    194 ## As lighttpd is a single-threaded server, its main resource limit is
    195 ## the number of file descriptors, which is set to 1024 by default (on
    196 ## most systems).
    197 ##
    198 ## If you are running a high-traffic site you might want to increase this
    199 ## limit by setting server.max-fds.
    200 ##
    201 ## Changing this setting requires root permissions on startup. see
    202 ## server.username/server.groupname.
    203 ##
    204 ## By default lighttpd would not change the operation system default.
    205 ## But setting it to 2048 is a better default for busy servers.
    206 ##
    207 server.max-fds = 2048
    218 
    219 ##
    220 ## Fine tuning for the request handling
    221 ##
    222 ## max-connections == max-fds/2 (maybe /3)
    223 ## means the other file handles are used for fastcgi/files
    224 ##
    225 server.max-connections = 1024

    1、静态服务器测试

    即apache、nginx、lighttpd性能对比。

    服务器相同配置 :

    开启gzip、关闭etag

    测试程序和web server在同一台服务器上,测试命令:

    ab -c 1000 -n 50000 http://localhost/index.html
    siege -c 1000 -r 20 http://localhost/index.html

    apache:html文件13k,gzip压缩为4.9k

    header:

    apache

    测试结果:

    并发  httpd子进程数 整机512M内存使用率 CPU使用率 iowait
    0 3 19% 0 0
    1000 10 30% 38% 0
    3000 14 60% 38% 0
    5000 10-30 65%-99% 20%-40% 0-30
    8000 100 99% 3%-50% 20-100

    nginx:html文件13.2k,gzip压缩为5.34k

    header:

    nginx
    Request URL:http://shaixuan.org/index.html
    Request Method:GET
    Status Code:200 OK
    Request Headersview source
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Charset:UTF-8,*;q=0.5
    Accept-Encoding:gzip,deflate,sdch
    Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
    Cache-Control:no-cache
    Connection:keep-alive
    Host:shaixuan.org
    Pragma:no-cache
    User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.8 (KHTML, like Gecko) Chrome/23.0.1251.2 Safari/537.8
    Response Headersview source
    Connection:keep-alive
    Content-Encoding:gzip
    Content-Type:text/html
    Date:Mon, 03 Sep 2012 13:19:23 GMT
    Last-Modified:Mon, 03 Sep 2012 12:33:45 GMT
    Server:nginx/1.2.3
    Transfer-Encoding:chunked

    测试结果:

     并发 整机512M内存使用率 CPU使用率 iowait
    0 29% 0 0
    1000 35% 40% 0
    3000 46% 43% 0
    5000 55% 42% 0-1
    8000 65% 45% 0
    15000 88% 45% 0
    17000 97% 47% 0

    lighttpd:html文件13k,gzip压缩为4.96k

    header:

    lighttpd
    Request URL:http://shaixuan.org/
    Request Method:GET
    Status Code:200 OK
    Request Headersview source
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Charset:UTF-8,*;q=0.5
    Accept-Encoding:gzip,deflate,sdch
    Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
    Cache-Control:max-age=0
    Connection:keep-alive
    Host:shaixuan.org
    Pragma:no-cache
    User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.8 (KHTML, like Gecko) Chrome/23.0.1251.2 Safari/537.8
    Response Headersview source
    Accept-Ranges:bytes
    Content-Encoding:gzip
    Content-Length:4819
    Content-Type:text/html
    Date:Tue, 04 Sep 2012 12:51:42 GMT
    ETag:"1028714895"
    Last-Modified:Tue, 04 Sep 2012 12:29:10 GMT
    Server:lighttpd/1.4.31
    Vary:Accept-Encoding

    测试结果:

     并发 整机512M内存使用率 CPU使用率 iowait
    0 29% 0 0
    1000     0
    3000 46% 41% 0-6
    5000 60% 40% 0-1
    8000 75% 45% 0
    12000 81% 35% 0
    14000 87% 36% 0
    16000 99% 40% 0

    2、动态服务器测试

    即apache + php module、nginx + php-fpm、nginx + php-cgi、lighttpd + spawn-fcgi对比。

    测试命令:

    siege -c 1200 -r 20 http://localhost/phpinfo.php
    /usr/local/apache2/bin/ab -c 100 -t 50 http://localhost/phpinfo.php

    php版本 5.4.6,测试代码phpinfo();

    apache + php module:php文件63.57k,gzip压缩为11.21k

    测试结果:

     并发 整机512M内存使用率 CPU使用率 iowait
    0 29% 0 0
    100 68% 8% 0
    200 72% 10% 0
    400 95% 10% 0
    600 99% 15% 1-15

    nginx + php-fpm(多个php-fpm子进程):php文件57.41k,gzip压缩为10.84k

    phpinfo显示Server API:FPM/FastCGI

    fastcgi的socket方式:tcp socket

    php编译参数:

    php-fpm
    ./configure --prefix=/usr/local/php-fpm --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --with-curl --with-mcrypt --enable-mbstring --enable-pdo --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --enable-zip

    测试结果:

     并发 整机512M内存使用率 CPU使用率 iowait siege成功率
    0 33% 0 0  
    100 37% 8% 0 100%
    200        
    400 45% 10% 0 99.96%
    800 55% 14个php-fpm,每个5.9M 12% 0 96.31%
    1000 60% 10% 0 90.77%
    1200 69%,Linux file限制,测试出错 30%    

    nginx + php-fpm(多个php-fpm子进程):php文件54.57k,gzip压缩为9.16k

    phpinfo显示Server API:FPM/FastCGI

    fastcgi的socket方式:unix domain socket

    测试结果:

     并发 整机512M内存使用率 CPU使用率 iowait siege成功率
    0 32% 0 0  
    100 35% 7% 0 100%
    200 40% 12% 0 100%
    400 43% 14% 0 100%
    800 55% 14% 0 96.70%
    1000 60% 21个php-fpm,每个5.9M 14% 0 92.02%
    1200 50%,Linux file限制,测试出错 50%  0 49%

    nginx + 一个php-cgi:php文件64.65k,gzip压缩为11.89k 

    sudo /usr/local/php-fpm/bin/php-cgi -b 9000 -q

    php-cgi可以常驻(long-live)监听一个端口,所以是fastcgi,但是由于没有进程管理器,只能启动一个进程,并发承受力低。

    phpinfo显示Server API:FPM/FastCGI

    测试结果:

    并发100时,经过5秒,php-cgi崩溃退出。

    lighttpd + lighttpd自带的spawn-fcgi进程管理器(多个php-cgi子进程):php文件58.68k,gzip压缩为9.83k 

    phpinfo显示Server API:CGI/FastCGI

    fastcgi的socket方式:unix domain socket

    lighttpd的fastcgi.conf配置:

    fastcgi.server
     22 fastcgi.server = ( ".php" =>
     23                    ( "php-local" =>
     24                      (
     25                        "socket" => socket_dir + "/php-fastcgi-1.socket",
     26                        "bin-path" => "/usr/local/php-fpm/bin/php-cgi",
     27                        "max-procs" => 2,
     28                        "broken-scriptfilename" => "enable",
     29                        "bin-environment" => (
     30                          "PHP_FCGI_CHILDREN" => "16",
     31                          "PHP_FCGI_MAX_REQUESTS" => "500",
     32                        ),
     33                      )
     34                    ),

    测试结果:

     并发 整机512M内存使用率 CPU使用率 iowait siege成功率
    0 53% 34个php-cgi进程,每个3M 0 0  
    100 65% 每个5.3M 10% 0  
    200 65% 每个5.7M 10% 0 100%
    400 72% 每个5.7M 11% 0 100%
    800 84% 每个5.7M 10% 0 99.49%
    1000 90% 每个5.7M 12% 0 97.41%
    1200 Linux file限制,测试出错      

    参考资料:

    http://www.cnblogs.com/killkill/archive/2010/04/14/1711810.html

    http://httpd.apache.org/docs/2.4/mod/mpm_common.html#MaxRequestWorkers

    http://www.php.net/manual/zh/install.fpm.php

    http://www.niutian365.com/blog/article.asp?id=263

    http://redmine.lighttpd.net/projects/1/wiki/Docs_ModCompress

    http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_PerformanceFastCGI

    http://php.net/manual/zh/install.unix.lighttpd-14.php

    http://www.361way.com/mpm/1052.html

    http://blog.chinaunix.net/uid-13939710-id-2861331.html

    http://www.yylib.com/blog/?p=70

    http://kb.cnblogs.com/page/95605/

    http://www.dbanotes.net/web/lighttpd_spawn-fcgi.html

    http://www.mike.org.cn/articles/what-is-cgi-fastcgi-php-fpm-spawn-fcgi/

    http://www.php.net/manual/zh/install.unix.apache2.php

    http://ferreousbox.iteye.com/blog/196212

    http://nigelzeng.iteye.com/blog/1197339

    http://blog.csdn.net/tujiyue/article/details/7027134

  • 相关阅读:
    CentOS7 配置NAT模式
    xshell连接centos经常掉线
    Linux shell Bash的基本功能3 多命令与管道符
    Linux shell Bash的基本功能2 输入输出与重定向
    Unity学习疑问记录之向量基础
    Unity学习疑问记录之触摸点坐标
    Unity学习疑问记录之保卫伦敦塔学习体会
    Unity学习疑问记录之Quaternion
    Unity学习疑问记录之Awake和Update
    Unity学习疑问记录之脚本生命周期
  • 原文地址:https://www.cnblogs.com/sink_cup/p/web_server.html
Copyright © 2020-2023  润新知