Varnish+nginx+php(FastCGI)+MYSQL5+MenCache+MenCachedb

來源:互聯網
上載者:User

標籤:style   blog   http   io   ar   os   for   sp   strong   

架構 Varnish+nginx+php(FastCGI)+MYSQL5+MenCache+MenCachedb

說明:
       我在設計系統架構時,進行了大膽的嘗試,只用6台Web伺服器,達到了可承受4000萬PV(頁面訪問量)的效能:

  拋棄了 Apache,因為它能承受的並發串連相對較低;
  拋棄了 Squid,因為它在記憶體利用、訪問速度、並發串連、清除緩衝等方面不如 Varnish;
  拋棄了 PHP4,因為 PHP5 處理物件導向代碼的速度要比 PHP4 快,另外,PHP4 已經不再繼續開發;
  拋棄了 F5 BIG-IP 負載平衡交換器,F5 雖然是個好東西,但由於價格不菲,多個部門多個產品都運行在其之上,流量大、負載高,從而導致效能大打折扣;

  利用 Varnish cache 減少了90%的資料庫查詢,解決了MySQL資料庫瓶頸;
  利用 Varnish cache 的記憶體快取命中加快了網頁的訪問速度;
  利用 Nginx + PHP5(FastCGI) 的勝過Apache 10倍的高並發效能,以最少的伺服器數量解決了PHP動態程式訪問問題;
  利用 Memcached 處理即時資料讀寫;
  利用 HAProxy 做介面伺服器健全狀態檢查;

  經過壓力測試,每台Web伺服器能夠處理3萬並發串連數,承受4千萬PV完全沒問題。

  保證4千萬PV的並發串連數:(40000000PV / 86400秒 * 10個派生串連數 * 5秒內響應 * 5倍峰值) / 6台Web伺服器 = 19290串連數

實驗證明:    
 
    舉個簡單的例子,伺服器192.168.0.2上運行Nginx+PHP,192.168.0.3上運行Apache+PHP,你在192.168.0.4上安裝壓力測試工具webbench,以30萬並發串連分別請求Nginx和Apache伺服器上的一個PHP檔案60秒鐘。在這期間,你用你的瀏覽器訪問Apache伺服器上的PHP檔案,會發現要麼是“該頁無法顯示”、要麼是等待好幾秒鐘才能開啟,而Nginx伺服器的PHP檔案,依然沒有絲毫影響,訪問速度仍然飛快。

webbench -c 300000 -t 60 http://192.168.0.2/index.php

webbench -c 300000 -t 60 http://192.168.0.3/index.php

 

以下為 Nginx 0.5.33 + PHP 5.2.5 (FastCGI) 伺服器在3萬並發串連下,開啟的10個Nginx進程和250個php-cgi進程時的系統負載情況:

 

 

-------------------------------------------------------------------------

安裝步驟:
  (系統要求:Linux 2.6+ 核心,本文中的Linux作業系統為AS4.3)

  一、擷取相關開來源程式:
  1、下載程式源碼包到目前的目錄:
  本文中提到的所有開源軟體為截止到2007年9月21日的最新穩定版。我將它們打了兩個壓縮包。

  第一個壓縮包:nginx_php_mysql_1.0_1of2.zip:
  :http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2289607

  第二個壓縮包:nginx_php_mysql_1.0_2of2.zip:
  :http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2289595

  2、解壓縮:

 unzip nginx_php_mysql_1.0_1of2.zip
 unzip nginx_php_mysql_1.0_2of2.zip


-------------------------------------------------------------------------
一、) 安裝Nginx
1.) 安裝
 Nginx ("engine x") 是一個高效能的 HTTP 和反向 Proxy伺服器,也是一個 IMAP/POP3/SMTP Proxy 伺服器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 網站開發的,它已經在該網站運行超過兩年半了。Igor 將原始碼以類BSD許可證的形式發布。儘管還是測試版,但是,Nginx 已經因為它的穩定性、豐富的功能集、樣本設定檔和低系統資源的消耗而聞名了。歡迎訪問 Nginx 的中文維基,http://wiki.codemongers.com/NginxChs.

2.)安裝Nginx所需的pcre庫:

[[email protected]]#tar zxvf pcre-7.2.tar.gz
[[email protected]]#cd pcre-7.2/
[[email protected]]#./configure
[[email protected]]#make && make install
[[email protected]]#cd ../


3.)Nginx的編譯參數如下:
[[email protected]]#./configure --user=www --group=www --prefix=/usr/local/nginx --with-openssl=/usr/include/openssl --with-pcre=/usr/local/lib --with-http_stub_status_module --without-http_memcached_module --without-http_fastcgi_module --without-http_rewrite_module --without-http_map_module --without-http_geo_module --without-http_autoindex_module    

在這裡,需要說明一下,由於Nginx的設定檔中我想用到正則,所以需要 pcre 模組的支援。上面安裝步驟裡我已經安裝了 pcre 及 pcre-devel 的rpm包,但是 Ngxin 並不能正確找到 .h/.so/.a/.la 檔案,因此我稍微變通了一下:

[[email protected]]#mkdir /usr/include/pcre/.libs/
[[email protected]]#cp /usr/local/lib/libpcre.a /usr/include/pcre/.libs/libpcre.a
[[email protected]]#cp /usr/local/lib/libpcre.a /usr/include/pcre/.libs/libpcre.la
[[email protected]]#cp /usr/local/lib/libpcre.a /usr/include/pcre/libpcre.a
[[email protected]]#cp /usr/local/lib/libpcre.a /usr/include/pcre/libpcre.la
然後,修改 objs/Makefile 大概在908行的位置上,注釋掉以下內容:

./configure --disable-shared

接下來,就可以正常執行 make 及 make install 了。

4.) 修改設定檔 /usr/local/server/nginx/conf/nginx.conf
以下是我的 nginx.conf 內容,僅供參考:

#運行使用者
user  nobody nobody;

#啟動進程
worker_processes  2;

#全域錯誤記錄檔及PID檔案
error_log  logs/error.log notice;
pid        logs/nginx.pid;

#工作模式及串連數上限
events {
        use epoll;
        worker_connections      1024;
}

#設定http伺服器,利用它的反向 Proxy功能提供負載平衡支援
http {
        #設定mime類型
        include       conf/mime.types;
        default_type  application/octet-stream;

        #設定日誌格式
        log_format main         ‘$remote_addr - $remote_user [$time_local] ‘
                                                ‘"$request" $status $bytes_sent ‘
                                                ‘"$http_referer" "$http_user_agent" ‘
                                                ‘"$gzip_ratio"‘;

        log_format download ‘$remote_addr - $remote_user [$time_local] ‘
                                                ‘"$request" $status $bytes_sent ‘
                                                ‘"$http_referer" "$http_user_agent" ‘
                                                ‘"$http_range" "$sent_http_content_range"‘;

        #設定請求緩衝
        client_header_buffer_size    1k;
        large_client_header_buffers  4 4k;

        #開啟gzip模組
        gzip on;
        gzip_min_length  1100;
        gzip_buffers     4 8k;
        gzip_types       text/plain;

        output_buffers   1 32k;
        postpone_output  1460;

        #設定access log
        access_log  logs/access.log  main;

        client_header_timeout  3m;
        client_body_timeout    3m;
        send_timeout           3m;

        sendfile                on;
        tcp_nopush              on;
        tcp_nodelay             on;

        keepalive_timeout  65;

        #設定負載平衡的伺服器列表
        upstream mysvr {
                #weigth參數表示權值,權值越高被分配到的幾率越大
                #本機上的Squid開啟3128連接埠
                server 192.168.8.1:3128 weight=5;
                server 192.168.8.2:80   weight=1;
                server 192.168.8.3:80   weight=6;
        }

        #設定虛擬機器主機
        server {
                listen          80;
                server_name     192.168.0.1 www.test.com;

                charset gb2312;

                #設定本虛擬機器主機的訪問日誌
                #access_log  logs/access.log  main;

                #如果訪問 /img/*, /js/*, /css/* 資源,則直接取本地檔案,不通過squid
                #如果這些檔案較多,不推薦這種方式,因為通過squid的緩衝效果更好
                location ~ ^/(img|js|css)/  {
                        root    /home/web;
                        expires 24h;
                }

                #對 "/" 啟用負載平衡
                location / {
                        proxy_pass      http://mysvr;

                        proxy_redirect          off;
                        proxy_set_header        Host $host;
                        proxy_set_header        X-Real-IP $remote_addr;
                        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                        client_max_body_size    10m;
                        client_body_buffer_size 128k;
                        proxy_connect_timeout   90;
                        proxy_send_timeout      90;
                        proxy_read_timeout      90;
                        proxy_buffer_size       4k;
                        proxy_buffers           4 32k;
                        proxy_busy_buffers_size 64k;
                        proxy_temp_file_write_size 64k;
                }

                #設定查看Nginx狀態的地址
                location /NginxStatus {
                        stub_status             on;
                        access_log              on;
                        auth_basic              "NginxStatus";
                        auth_basic_user_file  conf/htpasswd;
                }
        }
}

運行以下命令檢測設定檔是否無誤:

  如果沒有報錯,那麼就可以開始運行Nginx了,執行以下命令即可:
  備忘:conf/htpasswd 檔案的內容用 apache 提供的 htpasswd 工具來產生即可,內容大致如下:
 

5.) 查看 Nginx 運行狀態
 
輸入地址 http://192.168.0.1/NginxStatus/,輸入驗證帳號密碼,即可看到類似如下內容:

Active connections: 328
server accepts handled requests
9309 8982 28890
Reading: 1 Writing: 3 Waiting: 324

這裡我是用虛擬機器做的測試,所以連結數比較少.
  第一行表示目前活躍的串連數
  第三行的第三個數字表示Nginx運行到目前時間接受到的總請求數,如果快達到了上限,就需要加大上限值了。
top -b -nl
查看NGINX的進程號:
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}‘

6.)配置支援FCGI檔案
vi /usr/local/webserver/nginx/conf/fcgi.conf

輸入以下內容:


fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param  REDIRECT_STATUS    200;

7.)啟動Nginx

ulimit -SHn 51200
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

-------------------------------------------------------------------------

8.)配置開機自動啟動Nginx + PHP

vi /etc/rc.local

在末尾增加以下內容:

/usr/local/php/bin/spawn-fcgi -a 127.0.0.1 -p 10080 -C 250 -u www -f /usr/local/php/bin/php-cgi
ulimit -SHn 51200
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

-------------------------------------------------------------------------

Varnish+nginx+php(FastCGI)+MYSQL5+MenCache+MenCachedb

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.