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

版本修改歷史
版本
修改內容
修改人
日期
1.0
創建文檔
李樂,楊
2010-04-03
 

寫此文的目的:4月3、4日在家閒着,於是一起整理資料。

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和反向代理服務器, 它具有有很多非常優越的特性:

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

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

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

l 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、動靜分離和負載均衡的準備工作

l Host配置:

   127.0.0.1 yangli.com

l 服務器:win2003  1臺

l Web容器:Tomcat 6(8888端口)、Resin(8080端口)

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

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

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

l 項目部署:普通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

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

l 實現原理圖:

wps_clip_image1

配置原理圖

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;

            }

當我們請求:

wps_clip_image2

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

wps_clip_image3

當我們訪問:

wps_clip_image4

根據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

    }

下面來測試一下:

wps_clip_image4

實際上訪問了:

wps_clip_image5

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

測試如下:

1、關閉tomcat服務器

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

wps_clip_image6

表明tomcat已經被關閉

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

wps_clip_image7

請求到resin服務器上了。

3、啓動tomcat服務器:

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

wps_clip_image8

wps_clip_image9

頁面訪問正常

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

wps_clip_image10

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

7、總結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章