歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux Nginx vs Lighttd vs Apache & Apache vs IIS7

Linux Nginx vs Lighttd vs Apache & Apache vs IIS7

日期:2017/3/1 17:20:46   编辑:關於Linux

前文再續,話說歷經《Windows下Apache VS Lighttpd VS Nginx(Ngwsx)靜態文件對比》、《Windows下Zend Server VS Nginx VS Lighttpd PHP運行測試》,為了能更全面的展開Windows與Linux的各方面比較,我決定在同樣的機器上安裝Ubuntu Server。

為了四個現代化,我們要把測試進行到底!!

\

硬件環境

這也是我期待已久的測試,先附上Ubuntu Server環境的截圖:

\

還是那台電腦,不過換了個硬盤裝了Ubuntu Server。

WebServer安裝

手動編譯Nginx、Lighttpd、PHP,為了快速完成測試,編譯所需的依賴包都是用apt-get install,其中Pcre手動編譯,使用最新的8.21版本,編譯和安裝的指令摘錄如下:

Nginx為最新的1.1.14,Lighttpd為14.30, PHP 5.3.10 ,Zend Server為5.6(自帶的PHP為PHP 5.3.9,不過不是說這個版本的PHP有漏洞嗎?難道Zend自己不知道?但是因為是Zend Server自己整合安裝的,所以沒法變更),。

Nginx依賴庫
1
apt-get install zlib1g-dev libssl-dev libpcre3-dev libaio-dev


Nginx編譯指令
01
./configure \
02
--prefix=/usr/local/nginx \
03
--conf-path=/etc/nginx/nginx.conf \
04
--with-file-aio \
05
--with-http_ssl_module \
06
--with-http_realip_module \
07
--with-http_flv_module \
08
--with-http_gzip_static_module \
09
--with-http_stub_status_module \
10
--with-pcre=/usr/local/pcre


Nginx摘要信息
01
Configuration summary
02
+ using system PCRE library
03
+ using system OpenSSL library
04
+ md5: using OpenSSL library
05
+ sha1: using OpenSSL library
06
+ using system zlib library
07

08
nginx path prefix: "/usr/local/nginx"
09
nginx binary file: "/usr/local/nginx/sbin/nginx"
10
nginx configuration prefix: "/etc/nginx"
11
nginx configuration file: "/etc/nginx/nginx.conf"
12
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
13
nginx error log file: "/usr/local/nginx/logs/error.log"
14
nginx http access log file: "/usr/local/nginx/logs/access.log"
15
nginx http client request body temporary files: "client_body_temp"
16
nginx http proxy temporary files: "proxy_temp"
17
nginx http fastcgi temporary files: "fastcgi_temp"
18
nginx http uwsgi temporary files: "uwsgi_temp"
19
nginx http scgi temporary files: "scgi_temp"


Lighttpd依賴庫
1
apt-get install libev-dev libev-libevent-dev libfam-dev libmemcache-dev libgamin-dev


Lighttpd編譯指令
01
./configure \
02
--prefix=/usr/local/lighttpd \
03
--enable-lfs \
04
--disable-ipv6 \
05
--with-libev \
06
--with-pcre \
07
--with-zlib \
08
--with-bzip2 \
09
--with-fam \
10
--with-memcache


Lighttpd摘要信息
01
Plugins:
02

03
enabled:
04
mod_access
05
mod_accesslog
06
mod_alias
07
mod_auth
08
mod_cgi
09
mod_compress
10
mod_dirlisting
11
mod_evhost
12
mod_expire
13
mod_extforward
14
mod_fastcgi
15
mod_flv_streaming
16
mod_indexfile
17
mod_proxy
18
mod_redirect
19
mod_rewrite
20
mod_rrdtool
21
mod_scgi
22
mod_secdownload
23
mod_setenv
24
mod_simple_vhost
25
mod_ssi
26
mod_staticfile
27
mod_status
28
mod_trigger_b4_dl
29
mod_userdir
30
mod_usertrack
31
mod_webdav
32
disabled:
33
mod_cml
34
mod_magnet
35
mod_mysql_vhost
36

37
Features:
38

39
enabled:
40
auth-crypt
41
compress-bzip2
42
compress-deflate
43
compress-gzip
44
large-files
45
network-ipv6
46
regex-conditionals
47
stat-cache-fam
48
storage-memcache
49
disabled:
50
auth-ldap
51
network-openssl
52
storage-gdbm
53
webdav-locks
54
webdav-properties


PHP依賴庫
1
apt-get install libmysqlclient-dev libxml2-dev libjpeg62-dev libpng12-dev libxpm-dev libfreetype6-dev libgd2-xpm-dev libmhash-dev libmcrypt-dev libevent-dev libbz2-dev curl libcurl4-openssl-dev libicu-dev autoconf libmemcached-dev libfcgi-dev libbz2-dev libltdl-dev


PHP編譯指令
01
./configure \
02
--prefix=/usr/local/php-5.3.10 \
03
--enable-fpm \
04
--with-fpm-user=www \
05
--with-fpm-group=www \
06
--enable-fastcgi \
07
--with-openssl \
08
--with-pcre-regex=/usr/local/pcre \
09
--with-zlib \
10
--enable-bcmath \
11
--with-bz2 \
12
--enable-ftp \
13
--with-gd \
14
--with-mcrypt \
15
--with-jpeg-dir \
16
--with-png-dir \
17
--with-zlib-dir \
18
--with-xpm-dir \
19
--with-freetype-dir \
20
--enable-gd-native-ttf \
21
--with-mhash \
22
--with-curl \
23
--enable-intl \
24
--enable-mbstring \
25
--with-mysql \
26
--with-mysql-sock \
27
--with-mysqli \
28
--with-pdo-mysql \
29
--enable-shmop \
30
--enable-soap \
31
--enable-sockets \
32
--enable-zip \
33
--enable-calendar \
34
--enable-mysqlnd \
35
--with-pear \


PHP摘要信息
01
Installing PHP SAPI module: fpm
02
Installing PHP CLI binary: /usr/local/php-5.3.10/bin/
03
Installing PHP CLI man page: /usr/local/php-5.3.10/man/man1/
04
Installing PHP FPM binary: /usr/local/php-5.3.10/sbin/
05
Installing PHP FPM config: /usr/local/php-5.3.10/etc/
06
Installing PHP FPM man page: /usr/local/php-5.3.10/man/man8/
07
Installing PHP FPM status page: /usr/local/php-5.3.10/share/php/fpm/
08
Installing build environment: /usr/local/php-5.3.10/lib/php/build/
09
Installing header files: /usr/local/php-5.3.10/include/php/
10
Installing helper programs: /usr/local/php-5.3.10/bin/
11
program: phpize
12
program: php-config
13
Installing man pages: /usr/local/php-5.3.10/man/man1/
14
page: phpize.1
15
page: php-config.1
16
Installing PEAR environment: /usr/local/php-5.3.10/lib/php/
17
[PEAR] Archive_Tar - installed: 1.3.7
18
[PEAR] Console_Getopt - installed: 1.3.0
19
[PEAR] Structures_Graph- installed: 1.0.4
20
[PEAR] XML_Util - installed: 1.2.1
21
[PEAR] PEAR - installed: 1.9.4
22
Wrote PEAR system config file at: /usr/local/php-5.3.10/etc/pear.conf
23
You may want to add: /usr/local/php-5.3.10/lib/php to your php.ini include_path
24
/home/janpoem/php-5.3.10/build/shtool install -c ext/phar/phar.phar /usr/local/php-5.3.10/bin
25
ln -s -f /usr/local/php-5.3.10/bin/phar.phar /usr/local/php-5.3.10/bin/phar
26
Installing PDO headers: /usr/local/php-5.3.10/include/php/ext/pdo/
27

28
/usr/local/php-5.3.10/lib/php/extensions/no-debug-non-zts-20090626/
29

30
/var/tmp/xcache/mmap
31
/var/tmp/xcache/coredump
32
/var/tmp/xcache/coveragedump


題外話:被某人回復的某郵件氣得吐血了,我表示深度的無語和失望。

補充說明,php-fpm就是fastcgi,具體我就不羅嗦了。PHP編譯的基本指導原則是,安裝日常開發中用到的模塊,具體編譯內容參見php編譯指令部分。

不過由於當時忘記截圖了,所以我這裡簡單羅列一下,mbstring、PDO、iconv、json、pcre、xcache(Zend Server用的是Zend自帶的那個opcode緩存cache)等擴展。



Zend Server安裝,Zend Server的安裝需要在官方網站下載一個腳本,這個腳本會為你添加Zend的更新源,然後通過遠程下載的方式把Zend Server安裝完畢。這個Zend Server比較討厭,默認會給你裝一大堆東西,也沒有文檔去說明究竟是些什麼,好吧,暫時先不計較,繼續測試。

測試的環境與方法

測試服務器為192.168.33.120,Web端口為80。執行AB的機器在另外一台Ubuntu Server上進行,ip為192.168.33.6。然後我會用自己的筆記本開兩個putty,分別通過ssh登錄兩台服務器,192.168.33.120打開top監控系統資源和進程,192.168.33.6則用來執行AB的測試指令。這樣確保每個終端都只負責各所司職的功能。

而測試的文件與之前相似,測試兩個靜態文件,3個php腳本。分別為:

  • index.html,是新浪首頁昨天的內容,大小在600kb左右。
  • jquery-1.7.1.min.js,jQuery 1.7的壓縮模式,這個不用介紹了。
  • info.php,具體參照:http://my.oschina.net/janpoem/blog/39846
  • db.php,同上
  • open.php,同上

測試的方法,也和之前一樣:

10秒:ab -t 10 http://192.168.33.120/

並發測試:ab -c 100 -n 1000 http://192.168.33.120/

每個測試執行三次,然後記錄下rps的結果。其中,-t 10模式,通過rps值 * 10即其總共完成的請求數。而-c 100 -n 1000,必100%須完成了1000次請求的,才算達標。

第一次測試結果

第一次測試,主要為了找出同等環境下,rps分值較高者,每個服務器都使用的是默認的基礎配置,而PHP-FPM也設置了最小10個php-fpm進程,最大30。PHP-FPM是以Socket的方式,運行在127.0.0.1:9000上。

Nginx

10秒 index.html jquery-1.7.1.min.js info.php db.php open.php 19.12 116.78 145.57 276.33 17.94 19.13 117 145.81 276.62 17.94 19.14 117.37 145.85 276.26 18.06 並發測試 index.html jquery-1.7.1.min.js info.php db.php open.php 19.28 124.53 174.96 1273.61 19.21 19.3 124.54 175.1 1270.29 19.25 19.26 124.55 174.83 1269.34 19.27

Lighttpd

10秒 index.html jquery-1.7.1.min.js info.php db.php open.php 19.12 116.99 145.6 270.69 18.46 19.11 117.01 145.63 271.21 18.43 19.13 117.01 145.38 270.73 18.48 並發測試 index.html jquery-1.7.1.min.js info.php db.php open.php 19.28 124.65 175.01 1270.95 19.24 19.3 124.65 175.44 1281.82 19.23 19.28 124.65 175.29 1276.84 19.32

Zend Server 5.6, PHP 5.3.9, Apache 2.2.14

10秒 index.html jquery-1.7.1.min.js info.php db.php open.php 19.06 114.07 114.96 236.97 18.12 19.06 114.75 114.62 237.15 18.12 19.06 114.84 114.53 235.41 18.12 並發測試 index.html jquery-1.7.1.min.js info.php db.php open.php 19.32 122.93 143.83 1169.47 19.27 19.27 122.41 146.98 1172.19 19.29 19.26 123.08 147.41 1163.12 19.29

第一次測試結果總結

  1. Zend Server在Linux上的表現,遠不如在Windows上搶眼,雖然,這分值比之Windows上的結果還要好,但比起他前面的兩位小弟,還有很大的距離。
    令人意外的,Apache的靜態文件處理能力,並沒有像想象中一般,被Nginx、Lighttpd遠遠的拋離,大頁面上的表現,絲毫不遜,小文件上,只有2rps的落後。
    PHP fastcgi的處理模式上,終歸是Lighttpd和Nginx的成績要好,而且差距很明顯,不用再說了。
    就這個結果而言,Lighttpd的結果比Nginx要略好一些,IO方面的穩定性更好些。如處理小文件,jquery-1.7.1.min.js,在高並發的條件下,居然連續三次跑的測試分值都是一樣的,當然可能是碰巧,而open.php在-t 10模式下,rps也比nginx要略高一點點。
    不過平心而論,Nginx和Lighttpd的差距可以忽略不計。
    得出Nginx和Lighttpd是該次測試下的優勝者,故而決定加賽一場,對Nginx、Lighttpd、PHP-FPM都進行小量的優化,而後在進行同樣的測試。

    小范圍優化
    PHP-FPM方面,將listen的Socket模式改為文件模式,/dev/shm/php-fpm.sock,網上流傳說,這個會大大的提高性能。

    Nginx調優後的配置

    01
    user www www;
    02

    03
    worker_processes 8;
    04
    worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000;
    05
    worker_rlimit_nofile 102400;
    06

    07
    #error_log logs/error.log;
    08
    #error_log logs/error.log notice;
    09
    #error_log logs/error.log info;
    10

    11
    #pid logs/nginx.pid;
    12

    13

    14
    events {
    15
    use epoll;
    16
    worker_connections 102400;
    17
    }
    18

    19

    20
    http {
    21
    include mime.types;
    22
    default_type application/octet-stream;
    23

    24
    #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    25
    # '$status $body_bytes_sent "$http_referer" '
    26
    # '"$http_user_agent" "$http_x_forwarded_for"';
    27

    28
    #access_log logs/access.log main;
    29

    30
    sendfile on;
    31
    tcp_nopush on;
    32

    33
    #keepalive_timeout 0;
    34
    keepalive_timeout 60;
    35

    36
    server_names_hash_bucket_size 128;
    37
    client_header_buffer_size 2k;
    38
    large_client_header_buffers 4 4k;
    39
    client_max_body_size 8m;
    40

    41
    #gzip on;
    42

    43
    tcp_nodelay on;
    44

    45
    gzip on;
    46
    gzip_min_length 1k;
    47
    gzip_buffers 4 16k;
    48
    gzip_http_version 1.0;
    49
    gzip_comp_level 2;
    50
    gzip_types text/plain application/x-javascript text/css application/xml;
    51
    gzip_vary on;
    52

    53
    server {
    54
    listen 80;
    55
    server_name localhost;
    56

    57
    #charset koi8-r;
    58

    59
    #access_log logs/host.access.log main;
    60

    61
    location / {
    62
    root /srv/www;
    63
    index index.html index.htm index.php;
    64
    }
    65

    66
    error_page 500 502 503 504 /50x.html;
    67
    location = /50x.html {
    68
    root html;
    69
    }
    70

    71
    location ~ \.php$ {
    72
    root /srv/www;
    73
    fastcgi_pass unix:/dev/shm/php-fpm.sock;
    74
    fastcgi_index index.php;
    75
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    76
    include fastcgi_params;
    77
    }
    78
    }
    79
    }


    這個調優是根據這裡的介紹調整的http://www.2cto.com/os/201202/118474.html,不過很遺憾的是,fastcgi_cache部分配置始終不對,沒法啟用fastcgi_cache的擴展。



    Lighttpd的調優配置如下:

    001
    server.document-root = "/srv/www"
    002
    server.port = 80
    003
    server.username = "www"
    004
    server.groupname = "www"
    005

    006
    server.modules = (
    007
    "mod_rewrite",
    008
    "mod_redirect",
    009
    "mod_alias",
    010
    "mod_access",
    011
    # "mod_cml",
    012
    # "mod_trigger_b4_dl",
    013
    # "mod_auth",
    014
    "mod_status",
    015
    "mod_setenv",
    016
    "mod_fastcgi",
    017
    "mod_proxy",
    018
    # "mod_simple_vhost",
    019
    "mod_evhost",
    020
    # "mod_userdir",
    021
    "mod_cgi",
    022
    "mod_compress",
    023
    # "mod_ssi",
    024
    # "mod_usertrack",
    025
    "mod_expire",
    026
    # "mod_secdownload",
    027
    # "mod_rrdtool",
    028
    "mod_accesslog"
    029
    )
    030

    031
    #accesslog.filename = "/usr/local/lighttpd/log/access.log"
    032

    033
    mimetype.assign = (
    034
    ".pdf" => "application/pdf",
    035
    ".sig" => "application/pgp-signature",
    036
    ".spl" => "application/futuresplash",
    037
    ".class" => "application/octet-stream",
    038
    ".ps" => "application/postscript",
    039
    ".torrent" => "application/x-bittorrent",
    040
    ".dvi" => "application/x-dvi",
    041
    ".gz" => "application/x-gzip",
    042
    ".pac" => "application/x-ns-proxy-autoconfig",
    043
    ".swf" => "application/x-shockwave-flash",
    044
    ".tar.gz" => "application/x-tgz",
    045
    ".tgz" => "application/x-tgz",
    046
    ".tar" => "application/x-tar",
    047
    ".zip" => "application/zip",
    048
    ".mp3" => "audio/mpeg",
    049
    ".m3u" => "audio/x-mpegurl",
    050
    ".wma" => "audio/x-ms-wma",
    051
    ".wax" => "audio/x-ms-wax",
    052
    ".ogg" => "application/ogg",
    053
    ".wav" => "audio/x-wav",
    054
    ".gif" => "image/gif",
    055
    ".jar" => "application/x-java-archive",
    056
    ".jpg" => "image/jpeg",
    057
    ".jpeg" => "image/jpeg",
    058
    ".png" => "image/png",
    059
    ".xbm" => "image/x-xbitmap",
    060
    ".xpm" => "image/x-xpixmap",
    061
    ".xwd" => "image/x-xwindowdump",
    062
    ".css" => "text/css",
    063
    ".html" => "text/html",
    064
    ".htm" => "text/html",
    065
    ".js" => "text/javascript",
    066
    ".asc" => "text/plain",
    067
    ".c" => "text/plain",
    068
    ".cpp" => "text/plain",
    069
    ".log" => "text/plain",
    070
    ".conf" => "text/plain",
    071
    ".text" => "text/plain",
    072
    ".txt" => "text/plain",
    073
    ".dtd" => "text/xml",
    074
    ".xml" => "text/xml",
    075
    ".mpeg" => "video/mpeg",
    076
    ".mpg" => "video/mpeg",
    077
    ".mov" => "video/quicktime",
    078
    ".qt" => "video/quicktime",
    079
    ".avi" => "video/x-msvideo",
    080
    ".asf" => "video/x-ms-asf",
    081
    ".asx" => "video/x-ms-asf",
    082
    ".wmv" => "video/x-ms-wmv",
    083
    ".bz2" => "application/x-bzip",
    084
    ".tbz" => "application/x-bzip-compressed-tar",
    085
    ".tar.bz2" => "application/x-bzip-compressed-tar",
    086
    # default mime type
    087
    "" => "application/octet-stream",
    088
    )
    089

    090
    static-file.exclude-extensions = ( ".php", "~" )
    091
    index-file.names = ( "index.html", "index.php" )
    092

    093
    server.event-handler = "linux-sysepoll"
    094
    server.network-backend = "linux-sendfile"
    095
    server.stat-cache-engine = "fam"
    096
    server.max-keep-alive-requests = 0
    097

    098

    099
    #dir-listing.activate = "enable"
    100
    dir-listing.encoding = "utf8"
    101
    #dir-listing.show-readme = "enable"
    102

    103
    compress.cache-dir = "/var/lighttpd/cache"
    104
    compress.allowed-encodings = ("bzip2","gzip","deflate")
    105
    compress.filetype = ("text/plain","text/html","text/javascript","text/css")
    106

    107
    fastcgi.server = (
    108
    ".php" => (
    109
    "localhost" => (
    110
    "socket" => "/dev/shm/php-fpm.sock",
    111
    # "host" => "127.0.0.1",
    112
    # "port" => 9000,
    113
    "docroot" => "/srv/www"
    114
    )
    115
    ),
    116
    )
好,開始測試。

第二次測試結果

Nginx

10秒 index.html jquery-1.7.1.min.js info.php db.php open.php 19.11 115.95 145.45 265.31 18.3 19.1 116.15 145.72 267.37 18.35 19.11 116.06 145.38 269.52 18.32 並發測試 index.html jquery-1.7.1.min.js info.php db.php open.php 19.32 124.64 175 1288.84 19.27 19.25 124.64 175.17 1286.55 19.29 19.29 124.64 174.73 1286.36 19.28

Lighttpd

10秒 index.html jquery-1.7.1.min.js info.php db.php open.php 19.09 115.89 145.62 271.86 18.48 19.1 115.93 145.77 269.88 18.48 19.1 115.88 145.68 269.12 18.48 並發測試 index.html jquery-1.7.1.min.js info.php db.php open.php 19.26 124.5 175.27 1278.59 19.28 19.24 124.5 175.63 1285.4 19.28 19.22 124.5 175.62 1285.55 19.29

第二次測試結果總結

呃……

第二次的測試結果和第一次的測試結果,並沒有太大的偏差,這個讓人有些意外,但又覺得在情理之中。這個測試結果說明,這個數據已經是這台測試服務器下,最好的得分(最好的說法可能有些不妥,不過暫且這麼一說),沒有更多的硬件空間能讓WebServer去擠壓出更高rps出來。在這種情況,無論怎麼調優,都不可能獲得更好的測試結果。我想,如果換到更好的硬件環境下的服務器,可能才會獲得更好的分數。

不過從Nginx的配置文件,可以看出,Nginx比較貼近新硬件的發展趨勢,就是多核運算。他允許設置工作進程( worker_processes ),還允許分配不同的CPU核心。(誠如我在《Windows下Apache VS Lighttpd VS Nginx(Ngwsx)靜態文件對比》,Ngwsx,開啟了4個工作進程後,“但是高並發模式下,CPU占用高達25%,但是他也就是維持在25%,由於當時心急與想測試Lighttpd,沒有注意看,他是不是將計算分攤到4個CPU的核心上了。”,這次我明確的看到,他允許為工作進程分配具體的CPU核心,說明他是可以將計算分攤到4個CPU的核心上了。)雖然Nginx具體表現上看似沒有特別突出的表現,但是我相信換到更好的硬件環境裡,具體的調優配置是會令他有更加出色的表現。

而相比之下,Lighttpd在運行過程中,始終是一個單進程的lighttpd在運行,他也不具備面向並行運算的可調優的著手點。而lighttpd,長久以來更新速度緩慢,幾個年頭過去了,還維持在14.x,這個實在是令人擔憂這個產品的未來。

由於數據並沒有較大的提升,所以,也不適合對他們進行比較了(只有在承受到更大的壓力,通過數據的波動才能看出兩者的差異)。

再再加時

貌似測試可以告一段落了,不過此時,Max(同事甲)人說:你的Zend Server是測試在Windows XP SP2,那個破爛怎麼算數呢?你搞個Server版本的Windows測試來看看啊!好,再來一場加時賽!

Sam(同事乙)一陣忙,下載,刻碟,安裝,Server 2008 安裝ing.....安裝完畢!這裡就不羅嗦了,上個截圖:

\

還是那台電腦,還是那個CPU,還是那個內存,變了個臉。不過Server 2008是32bit的,因為目前PHP主要都是32bit的。64bit,不是不行,但是都凌晨2、3點了,我可不想再在windows上手動編譯PHP了。Sam冒著胃疼堅持著,我自信告訴他,一個小時,給我一個小時,絕對完成所有任務。

開始安裝,IIS 7,+CGI,配置fastcgi,一頓忙...然後亮了,截個圖:

\

因為通過第一、第二次的測試,我們已經得到想要的答案了,只是為了更加全面些,才加測試了Server 2008,所以IIS直接就開了gzip什麼的。

Zend Server用的還是之前測試的那個版本(沒裝新的),直接打開原來C盤的Zend目錄,打開Apache\bin\httpd.exe,彈出一個黑窗口,哦耶,截個圖:

\

大家可能會很迷惑,說,你小子會不會拿個Ubuntu Server下的Zend Server來這裡糊弄事啊?哎喲,那對比著下面這張圖,和再下面的這張圖看吧:

\

這是Ubuntu上的Zend Server,看出究竟了嗎?

\

這是Ubuntu上的lighttpd截圖。

由於Windows上的Zend Server,之前已經測試過,而且也調優過,所以也就不再羅嗦了。

第三次測試結果

IIS 7

10秒 index.html jquery-1.7.1.min.js info.php db.php open.php 18.07 86.67 76.63 84.1 16.71 18.11 87.16 75.3 86.72 16.63 18.1 87.34 76.35 94.73 16.82 並發測試 index.html jquery-1.7.1.min.js info.php db.php open.php 19.36 124.63 163.27 370.3 19.31 19.36 124.63 165.81 347.22 19.18 19.34 124.62 165.87 357 19.3

Zend Server(windows)

10秒 index.html jquery-1.7.1.min.js info.php db.php open.php 16.03 77.88 76.62 65.29 17.19 16.03 78.03 77.73 63.93 17.24 16.13 78.52 76.94 69.12 17.21 並發測試 index.html jquery-1.7.1.min.js info.php db.php open.php 19.34 124.35 134.83 941.01 19.34 18.9 124.43 135.51 995.14 19.31 19.29 124.34 134.37 1055.32 19.31

第三次測試結果總結

先說靜態文件處理,沒想到,IIS 7的成績居然那麼好,尤其是並發測試的結果(廢話,Sam在旁邊大叫,Zend Server是開外掛的,IIS那就是開內掛)。 雖然在-t的測試模式落後,但是一直被人诟病的Windows卻在並發測試下和Linux的相差無二。連Apache也當仁不讓,靜態文件處理的RPS也優於xp的測試結果。

不過看php的處理方面,結果慘不忍睹啊,和Linux比,完全落後一大截。通過Windows和Linux在靜態文件上所得到的相近的 RPS ,能夠更加充分的說明,Windows絕對不是PHP運行的最佳環境。但是唯獨一點有不同,就是IO的性能表現上。

“Windows的IO不如Linux”,這是一句我們常常看到人們在說的話題,可是事實上,通過open.php和index.html的對比測試結果可以看出,通過php的打開文件輸出,其性能是接近WebServer輸出的,當然他需要更大的開銷。而通過橫向對比5個測試結果,PHP在處理這種IO,在不同平台下的差異並沒有那麼大。而通過比較並發測試靜態文件結果,也充分說明,Windows和Linux,在文件讀取上,性能是接近的(當然,更好的硬件環境是不是會有差別呢?有待證實)。

當然,在測試數據以外的,是CPU使用率,系統剩余資源的情況,這方面我沒有做截圖比較,但是我去看服務器的時候,也會看到,Windows Server 2008在處理並發測試時,會有更高的CPU使用(遠不似Linux下Nginx處理的那樣平滑,而且可以多進程負載)。

最終總結

  • 作為PHP運行環境的選擇來說,Windows並不是最佳的平台。第三次測試的結果,充分的說明了這點(IIS和Windows下的Apache在並發測試中能與Linux的結果接近,但是PHP結果卻遠遠不如)。
  • 不能用快、慢這樣的詞匯去描述一個平台或WebServer,只有更合適的選擇,更合適的搭配。而事實上,所謂快、慢從根本上、客觀上,還是看你擁有多強大的硬件,你的硬件有多好,你的服務器就有多快。脫離硬件環境去比較任何的平台和WebServer都是傻B、2B的表性。
  • 以面向未來、發展的角度來看(迎合各種新生事物,並發計算、多核計算、雲計算、服務器集群),Nginx,以其輕巧(整個Nginx都很小巧)、整合程度(非動態加載插件的模式)、易於部署(他的配置可比Lighttpd要簡單得多了)、面向多核計算的可配置型、強大的Proxy(這就是道聽途說的了,目前還沒機會測試到),Nginx是最具潛力的WebServer,也是Linux環境下的最好選擇。
  • Zend Server作為一個商業產品,無論在Windows平台,還是Linux平台,都落後其競爭對手,他不是一個劃算的選擇。尤其是Linux平台下,Zend Server會自帶了很多莫名其妙的東西進來,這讓人覺得很不放心。而Zend Server本身,在其發展的過程中,也曾爆出過幾次較為嚴重的系統漏洞。
    \
    注意看上圖中的zdd和jqd兩個進程,這事Zend自己啟動的進程,目前尚未能從官網看到任何關於他的描述。這讓人感到某種隱隱的不安。
  • 雖然Windows和Linux在並發測試的靜態文件中,看似結果相近。但是Windows作為一個GUI的界面,需要消耗更多的系統資源(雖然也有純DOS命令的Server 2008,但我可不是DOS粉)。而選擇Server 2008,在同等配置下,運行PHP幾乎損失了近一半的RPS。也就是說,你不到要交Server 2008的系統費用,同時,你還得再掏錢來補回這部分損失掉的這一半RPS。如果主要是PHP,真的不適合選擇Windows作為服務器。
  • 我們常常會被一些片面的測試結果所誤導,誤以為,Windows性能很差、Apache很慢,你甚至都能頭頭是道的說出個大天來,然後末了還不忘貼幾個鏈接來強化自己的結果。但是通過今天測試的結果,我反而更加客觀的看到,這四個WebServer,都是面向高並發、高負載而設計的,就這個角度而言,他們都是合格的。可是在同樣合格的結果面前,我們要比較的,是他是怎麼做到的,他付出多大的代價做到的,他這樣做的後果是什麼,而他對其所在的環境裡,又有什麼影響。然後,才能促成我們最終做出合適的選擇。

尾聲

歷經2天余的折騰,針對Windows平台和Linux平台的對比測試終於告一段落了。

再次感謝Max和Sam整個過程給予的幫助,尤其是Sam,能在一下午之內在同一台機器上裝好Ubuntu Server和Server 2008,多虧了他的協助。

這次測試的主要是風口浪尖中的4個主角,不過敢誇口自稱性能卓越的 WebServer,仍有很多。而我,也打算繼續對他們測試到底。這不,Sam又舉了兩個,據說其中一個是用.net實現的,支持fastcgi,我的手又癢了

摘自 曾建凱的博客

Copyright © Linux教程網 All Rights Reserved