分類  >  互聯網 >

利用Nginx實現響動分離和負載均衡

tags:    時間:2013-12-27 15:41:55
利用Nginx實現動靜分離和負載均衡

http://jooben.blog.51cto.com/253727/309280

 

1、Nginx介紹

 

 

   Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 伺服器,也是一個 IMAP/POP3/SMTP 代理伺服器 。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的Rambler.ru 站點開發的,它已經在該站點運行超過四年多了。Igor 將源代碼以類BSD許可證的形式發布。自Nginx 發布四年來,Nginx 已經因為它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名了。目前國內各大門戶網站已經部署了Nginx,如新浪、網易、騰訊等;國內幾個重要的視頻分享網站也部署了Nginx,如六房間、酷6等。新近發現Nginx 技術在國內日趨火熱,越來越多的網站開始部署Nginx。

 

 

 

 

 

2、為什麼使用Nginx

 

 

   Nginx 是一個高性能Web和反向代理伺服器, 它具有有很多非常優越的特性:

 

 

在高連接併發的情況下,Nginx是Apache伺服器不錯的替代品: Nginx在美國是做虛擬主機生意的老闆們經常選擇的軟體平台之一. 能夠支持高達 50,000 個併發連接數的響應, 感謝Nginx為我們選擇了 epoll and kqueue 作為開發模型.

 

 

Nginx作為負載均衡伺服器: Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務, 也可以支持作為 HTTP代理 伺服器對外進行服務. Nginx採用C進行編寫, 不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多.

 

 

作為郵件代理伺服器: Nginx 同時也是一個非常優秀的郵件代理伺服器(最早開發這個產品的目的之一也是作為郵件代理伺服器), Last.fm 描述了成功並且美妙的使用經驗.

 

 

Nginx 是一個 [#installation 安裝] 非常的簡單 , 配置文件 非常簡潔(還能夠支持perl語法), Bugs 非常少的伺服器: Nginx 啟動特別容易, 並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動. 你還能夠 不間斷服務的情況下進行軟體版本的升級 。

 

 

以上都是官方的一些說法,看看網上的一些意見:「4GB內存的伺服器+Apache(prefork模式)一般只能處理3000個併發連接,因為它們將佔用3GB以上的內存,還得為系統預留1GB的內存。我曾經就有兩台Apache伺服器,因為在配置文件中設置的MaxClients為4000,當Apache併發連接數達到3800時,導致伺服器內存和Swap空間用滿而崩潰。而這台 Nginx 0.5.31 + PHP 5.2.4 (FastCGI) 伺服器在3萬併發連接下,開啟的10個Nginx進程消耗100M內存(20MB*10=100M),開啟的250個php-cgi進程消耗1G內存(4MB*250≈1GB),加上系統自身消耗的內存,總共才消耗2GB內存。如果伺服器內存較小,完全可以只開啟25個php-cgi進程,這樣php-cgi消耗的總內存數才100M。在開啟25個php-cgi進程的情況下,每分鐘的處理能力只比開啟250個php-cgi進程時低了不到一半。

 

 

 

 

 

3、Nginx的安裝

 

 

   基於李,楊家用的1台主機,操作系統是Win2003版本的,進行安裝配置。

 

 

    Windows的安裝比較簡單,直接到http://wiki.nginx.org/NginxInstall下載需要的壓縮包,解壓到相應目錄(假如是C:/nginx),點擊目錄下面的nginx.exe即可啟動。

 

 

 

 

 

4、動靜分離和負載均衡的準備工作

 

 

Host配置:

 

 

   127.0.0.1 yangli.com

 

 

伺服器:win2003  1台

 

 

Web容器:Tomcat 6(8888埠)、Resin(8080埠)

 

 

              Tomcat和resin都部署相同應用,getUsers.jsp作為測試頁面。

 

 

反向代理伺服器:Nginx-0.8.34.zip

 

 

                    靜態目錄路徑:e:/home/htmlfile/getUsers.html

 

 

項目部署:普通web項目,例如:example

 

 

Resin-3.0.26配置:

 

 

       <host id="yangli.com" root-directory=".">

 

 

       <web-app id="/" document-directory="E:/example/webapp"/>

 

 

       </host>

 

 

Apache-tomcat-6.0.26 配置文件:

 

 

        D:\apache-tomcat-6.0.26\webapps\examples

 

 

        修改:D:\apache-tomcat-6.0.26\conf\server.xml

 

 

        增加:

 

 

<Host name="yangli.com"  appBase="D:\apache-tomcat-6.0.26\webapps\examples"

 

 

            unpackWARs="true" autoDeploy="true"

 

 

            xmlValidation="false" xmlNamespaceAware="false">

 

 

  <Context path="" docBase="D:\apache-tomcat-6.0.26\webapps\examples">

 

 

          </Context>

 

 

  </Host>

 

 

主要是為了解決訪問tomcat伺服器的時候,

 

 

不需要http://yangli.com:8888/examples/getUser.jsp

 

 

可以直接訪問:http://yangli.com:8888/getUser.jsp

 

 

具體說明,可以上網搜搜。

 

 

實現原理圖:

 

 

 

 

 

 

 

 

 

 

 

 

 

配置原理圖

 

 

 

 

 

5、動靜分離

 

 

假設後端只有一台web伺服器,配置如下:

 

 

upstream yangli.com {

 

 

   server 127.0.0.1:8888;

 

 

   #tomcat

 

 

}

 

 

 

 

 

server {

 

 

        listen       2010;

 

 

        server_name  yangli.com;

 

 

        access_log  off;

 

 

        location / {

 

 

            root   e:/home/htmlfile;           

 

 

            index index.html index.htm;        

 

 

            if (!-f $request_filename) {

 

 

    rewrite ^/([a-zA-Z]+).html   /$1.jsp last;

 

 

                proxy_pass http://yangli.com;

 

 

                break;

 

 

            }

 

 

        }

 

 

}

 

 

註明:如果是靜態文件將定位到:e:/home/htmlfile;  目錄

 

 

      如果e:/home/htmlfile不存在該文件,則請求到後端伺服器:

 

 

      這裡使用了rewrite規則rewrite ^/([a-zA-Z]+).html   /$1.jsp last;

 

 

     if (!-f $request_filename) {

 

 

    rewrite ^/([a-zA-Z]+).html   /$1.jsp last;

 

 

                proxy_pass http://yangli.com;

 

 

                break;

 

 

            }

 

 

 

 

 

當我們請求:

 

 

 

 

 

 

 

 

 

 

 

 

 

此時:訪問的是E:\home\htmlfile\2010.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

當我們訪問:

 

 

 

 

 

 

 

根據rewrite規則,實際請求到了:127.0.0.1:8888上的tomcat進行處理,這樣子就實現了動靜分離,而對於用戶來說,感覺只是僅僅訪問了html頁面。

 

 

同樣測試Resin,也是成功的。

 

 

 

 

 

6、負載均衡

 

 

 

 

 

1. Nginx 負載均衡基礎知識

 

 

nginx的upstream目前支持4種方式的分配

 

 

1)、輪詢(默認)

 

 

每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。

 

 

2)、weight

 

 

指定輪詢幾率,weight和訪問比率成正比,用於後端伺服器性能不均的情況。

 

 

2)、ip_hash

 

 

每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。

 

 

3)、fair(第三方)

 

 

按後端伺服器的響應時間來分配請求,響應時間短的優先分配。

 

 

4)、url_hash(第三方)

 

 

在需要使用負載均衡的server中增加

 

 

proxy_pass http://yangli.com;

 

 

 

 

 

每個設備的狀態設置為:

 

 

a)        down 表示單前的server暫時不參與負載

 

 

b)        weight 默認為1.weight越大,負載的權重就越大。

 

 

c)        max_fails :允許請求失敗的次數默認為1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤

 

 

d)        fail_timeout:max_fails次失敗后,暫停的時間。

 

 

e)        backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這台機器壓力會最輕。

 

 

 

 

 

 修改配置如下:

 

 

    upstream yangli.com {

 

 

       server 127.0.0.1:8888;

 

 

       #tomcat

 

 

       server 127.0.0.1:8080 backup;

 

 

       #resin

 

 

    }

 

 

 

 

 

下面來測試一下:

 

 

 

 

 

 

 

實際上訪問了:

 

 

 

 

由於:resin設為backup,那麼當tomcat宕機了,nginx會將請求發送到resin伺服器,此時resin接管了tomcat,為外界提供服務。

 

 

 

 

 

測試如下:

 

 

1、關閉tomcat伺服器

 

 

執行:D:\apache-tomcat-6.0.26\bin\shutdown.bat

 

 

 

 

表明tomcat已經被關閉

 

 

 

 

 

2、訪問http://yangli.com:2010/getUsers.html

 

 

 

 

 

 

 

請求到resin伺服器上了。

 

 

 

 

 

3、啟動tomcat伺服器:

 

 

D:\apache-tomcat-6.0.26\bin\startup.bat

 

 

 

 

 

 

頁面訪問正常

 

 

4、訪問http://yangli.com:2010/getUsers.html

 

 

 

 

由於tomcat工作正常,於是又接管,作為主伺服器進行工作。

 

 

 

 

 

7、總結

 

 

   本文主要闡述了利用Nginx實現動靜分離和負載均衡,其中後端伺服器使用了Resin和Tomcat,旨在表明Nginx並不關心後端伺服器類型,只要後端伺服器部署了相同的應用,訪問正常即可。

推薦閱讀文章

Bookmark the permalink ,來源:互聯網