互聯(lián)網(wǎng)創(chuàng)業(yè)的準備:Web Server
測試環(huán)境:
vr.org 的 VPS
CPU:2核共享
內(nèi)存: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
結(jié)論:
靜態(tài)服務(wù)器:
并發(fā):nginx(17000)> lighttpd(14000)> apache(5000)
注意:lighttpd開啟gzip壓縮時,無法禁用etag……不建議使用。參考:《高性能網(wǎng)站建設(shè)指南》
動態(tài)服務(wù)器:
大約并發(fā):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低很多。
服務(wù)器OS一定要使用Linux 2.6內(nèi)核及更高,因為才能支持epoll。
建議服務(wù)器使用Ubuntu server x64,因為工程師PC使用Ubuntu x64較多(Ubuntu的顯卡驅(qū)動安裝方便),這樣編譯部署都一致。
如果服務(wù)器使用CentOS x64,則工程師PC使用Fedora x64,即可保持一致。
因為內(nèi)核都是一樣的,Ubuntu、CentOS等各個Linux發(fā)行版對服務(wù)器來說沒有區(qū)別,所以挑一個順手的即可。
參考互聯(lián)網(wǎng)公司的web server:
| 163.com | 靜態(tài)nginx | 
| t.qq.com | 靜態(tài)squid,動態(tài)nginx | 
| taobao.com | 靜態(tài)Tengine,動態(tài)Tengine(nginx衍生版) | 
| 小米論壇 | 靜態(tài)Tengine,動態(tài)Tengine | 
| 百度 | 靜態(tài)lighttpd,動態(tài)lighttpd(有etag) | 
測試過程:
Apache httpd 2.4.3
編譯參數(shù):
- ./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"
 
默認并發(fā)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>
 
并發(fā)改成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:
編譯參數(shù):
- ./configure --prefix=/usr/local/nginx --with-pcre=/usr/local/pcre
 
lighttpd 1.4.31:
默認并發(fā)1024,server.max-fds最大可修改為65535,server.max-connections最大可修改為32767:
- ##
 - ## As lighttpd is a single-threaded server, its main resource limit is
 - ## the number of file descriptors, which is set to 1024 by default (on
 - ## most systems).
 - ##
 - ## If you are running a high-traffic site you might want to increase this
 - ## limit by setting server.max-fds.
 - ##
 - ## Changing this setting requires root permissions on startup. see
 - ## server.username/server.groupname.
 - ##
 - ## By default lighttpd would not change the operation system default.
 - ## But setting it to 2048 is a better default for busy servers.
 - ##
 - server.max-fds = 2048
 - ##
 - ## Fine tuning for the request handling
 - ##
 - ## max-connections == max-fds/2 (maybe /3)
 - ## means the other file handles are used for fastcgi/files
 - ##
 - server.max-connections = 1024
 
#p#
1、靜態(tài)服務(wù)器測試
即apache、nginx、lighttpd性能對比。
服務(wù)器相同配置 :
開啟gzip、關(guān)閉etag
測試程序和web server在同一臺服務(wù)器上,測試命令:
- 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:
測試結(jié)果:
| 并發(fā) | httpd子進程數(shù) | 整機512M內(nèi)存使用率 | 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
 
測試結(jié)果:
| 并發(fā) | 整機512M內(nèi)存使用率 | 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
 
測試結(jié)果:
| 并發(fā) | 整機512M內(nèi)存使用率 | 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 | 
#p#
2、動態(tài)服務(wù)器測試
即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
測試結(jié)果:
| 并發(fā) | 整機512M內(nèi)存使用率 | 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編譯參數(shù):
- ./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
 
測試結(jié)果:
| 并發(fā) | 整機512M內(nèi)存使用率 | 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
測試結(jié)果:
| 并發(fā) | 整機512M內(nèi)存使用率 | 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)監(jiān)聽一個端口,所以是fastcgi,但是由于沒有進程管理器,只能啟動一個進程,并發(fā)承受力低。
phpinfo顯示Server API:FPM/FastCGI
測試結(jié)果:
并發(fā)100時,經(jīng)過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
 - fastcgi.server = ( ".php" =>
 - ( "php-local" =>
 - (
 - "socket" => socket_dir + "/php-fastcgi-1.socket",
 - "bin-path" => "/usr/local/php-fpm/bin/php-cgi",
 - "max-procs" => 2,
 - "broken-scriptfilename" => "enable",
 - "bin-environment" => (
 - "PHP_FCGI_CHILDREN" => "16",
 - "PHP_FCGI_MAX_REQUESTS" => "500",
 - ),
 - )
 - ),
 
測試結(jié)果:
| 并發(fā) | 整機512M內(nèi)存使用率 | 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
原文鏈接:http://www.cnblogs.com/sink_cup/archive/2012/09/14/web_server.html















 
 
 

 
 
 
 