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和反向代理服務器, 它具有有很多非常優越的特性(主要是基于Linux系統闡述的):

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 實現原理圖:

 

 

 

 

配置原理圖

 

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并不關心后端服務器類型,只要后端服務器部署了相同的應用,訪問正常即可。

 

 

最后附上nginx配置:

     upstream yangli.com {
           server 127.0.0.1:8888;
           server 127.0.0.1:8080 backup;
       }


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;
            }
        }

    }


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jooben/archive/2010/04/06/5454995.aspx