windows 下 nginx+iis 實現負載平衡方案

來源:互聯網
上載者:User

nginx安裝

Nginx是一款輕量級的Web 服務器/反向 Proxy伺服器及電子郵件(IMAP/POP3)Proxy 伺服器,並在一個BSD-like 協議下發行。由俄羅斯的程式設計師Igor Sysoev所開發,供俄國大型的入口網站及搜尋引擎Rambler(俄文:Рамблер)使用。其特點是佔有記憶體少,並發能力強,事實上nginx的並發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站使用者有:百度、新浪、網易、騰訊等。

最新版本的nginx版本為1.9.3,我這下載的是window版本的,一般實際情境都是安裝在linux系統下的,由於linux系統目前正在摸索中這裡就不介紹。官方下載地址:nginx-1.9.3.zip 部落格園下載地址:nginx-1.9.3.zip 。下載完成之後解壓運行nginx.exe就啟動了nginx了,啟動後會在進程裡面看到nginx。


要實現負載平衡需要修改conf/nginx.conf的配置資訊,修改配置資訊之後重新啟動nginx服務,可以通過nginx -s reload指令實現。這裡我們使用 Ants 提供的一個批處理來操作。



將nginx.bat檔案放到nginx.exe相同檔案夾下,直接運行就行了。文章結尾會提供本文用到的所有檔案。

 


網站搭建及配置

1.搭建兩個iis網站

網站下只有一個簡單的index頁面,用來輸出當前伺服器資訊。由於我沒有兩台機器,所以將兩個網站都部署到本機了,分別綁定了8082和9000兩個連接埠。

 protected void Page_Load(object sender, EventArgs e)
        {
            Label0.Text = "請求開始時間:"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            Label1.Text = "伺服器名稱:" + Server.MachineName;//伺服器名稱  
            Label2.Text = "伺服器IP地址:" + Request.ServerVariables["LOCAL_ADDR"];//伺服器IP地址  
            Label3.Text = "HTTP訪問連接埠:" + Request.ServerVariables["SERVER_PORT"];//HTTP訪問連接埠"
            Label4.Text = ".NET解釋引擎版本:" + ".NET CLR" + Environment.Version.Major + "." + Environment.Version.Minor + "." + Environment.Version.Build + "." + Environment.Version.Revision;//.NET解釋引擎版本  
            Label5.Text = "伺服器作業系統版本:" + Environment.OSVersion.ToString();//伺服器作業系統版本  
            Label6.Text = "伺服器IIS版本:" + Request.ServerVariables["SERVER_SOFTWARE"];//伺服器IIS版本  
            Label7.Text = "伺服器網域名稱:" + Request.ServerVariables["SERVER_NAME"];//伺服器網域名稱  
            Label8.Text = "虛擬目錄的絕對路徑:" + Request.ServerVariables["APPL_RHYSICAL_PATH"];//虛擬目錄的絕對路徑  
            Label9.Text = "執行檔案的絕對路徑:" + Request.ServerVariables["PATH_TRANSLATED"];//執行檔案的絕對路徑  
            Label10.Text = "虛擬目錄Session總數:" + Session.Contents.Count.ToString();//虛擬目錄Session總數  
            Label11.Text = "虛擬目錄Application總數:" + Application.Contents.Count.ToString();//虛擬目錄Application總數  
            Label12.Text = "網域名稱主機:" + Request.ServerVariables["HTTP_HOST"];//網域名稱主機  
            Label13.Text = "伺服器地區語言:" + Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"];//伺服器地區語言  
            Label14.Text = "使用者資訊:" + Request.ServerVariables["HTTP_USER_AGENT"];
            Label14.Text = "CPU個數:" + Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS");//CPU個數  
            Label15.Text = "CPU類型:" + Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER");//CPU類型  
            Label16.Text = "請求來源地址:" + Request.Headers["X-Real-IP"];
        }


2.修改nginx配置資訊

修改nginx監聽連接埠,修改http server下的listen節點值,由於本機80連接埠已經被佔用,我改為監聽8083連接埠。

listen       8083;

在http節點下添加upstream(伺服器叢集),server設定的是叢集伺服器的資訊,我這裡搭建了兩個網站,配置了兩條資訊。

#伺服器叢集名稱為Jq_one
upstream Jq_one {
  server  127.0.0.1:9000;
  server  127.0.0.1:8082;
}

在http節點下找到location節點修改

location / {
        root   html;
        index  index.aspx index.html index.htm; #修改首頁為index.aspx
 #其中jq_one 對應著upstream設定的叢集名稱
 proxy_pass         http://Jq_one;
 #設定主機頭和用戶端真真實位址,以便伺服器擷取用戶端真實IP
 proxy_set_header   Host             $host;
 proxy_set_header   X-Real-IP        $remote_addr;
 proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
}

修改完成設定檔以後記得重啟nginx服務,最終完整設定檔資訊如下



3.運行結果


訪問http://127.0.0.1:8083/index.aspx ,多訪問幾次,著重關註標紅部分。



可以看到,我們的請求被分發到了8082網站和9000網站,並且第一次是8082網站第二次9000。出現這樣的結果證明我們負載平衡搭建成功了。 嘗試關閉其中的9000網站,然後重新整理頁面發現輸出的http連接埠一直是8082,也就是說其中一個網站掛了,只要還有一個網站是好的,我們的還是可以服務。

問題分析

雖然我們搭建好了負載平衡網站,但是還存在以下問題。

1.如果網站使用了session,請求平均分配到兩個網站,那麼必然存在session共用問題,該如何解決?

使用資料庫儲存session資訊
使用nginx將同一ip的請求分配到固定伺服器,修改如下。ip_hash會計算ip對應hash值,然後分配到固定伺服器

  upstream Jq_one{
  server 127.0.0.1:8082 ;
   server 127.0.0.1:9000 ;
  ip_hash;
  }

搭建一台Redis伺服器,對session的讀取都從該Redis伺服器上讀取。後面的文章將介紹分布式緩衝Redis的使用

2.管理員更新網站檔案,該怎麼操作,現在還只有兩台伺服器,可以手工將檔案更新到兩台伺服器,如果是10台呢,那麼手工操作必然是不可行的

多伺服器網站更新可以使用GoodSync 檔案同步程式,會自動檢測檔案的修改新增,然後同步到其它伺服器上。在linux下可以使用rsync

3.網站中的檔案上傳功能會將檔案分配到不同的伺服器,檔案分享權限設定問題如何解決。

使用檔案伺服器將所有檔案儲存體到該伺服器上,檔案操作讀取寫入都在該伺服器上。這裡同樣會存在一個問題,檔案伺服器存在讀寫上限。

4.負載的伺服器配置不一樣,有的高有的低可不可以讓配置高的伺服器處理請求多一些

這裡講一下,負載平衡有好幾種演算法  輪轉法,散列法, 最少串連法,最低缺失法,最快響應法,加權法。我們這裡可以使用加權法來分配請求。

 upstream Jq_one{
  server 127.0.0.1:8082 weight=4;
   server 127.0.0.1:9000 weight=1;
  ip_hash;
  }

通過weight設定每台伺服器分配請求站的權重,值越高分配的越多。

5.由於請求是經過nginx轉寄過來的,可以在代碼裡面擷取到使用者請求的實際ip地址嗎?

答案是肯定的,在localtion節點設定如下要求標頭資訊

#設定主機頭和用戶端真真實位址,以便伺服器擷取用戶端真實IP
 proxy_set_header   Host             $host;
 proxy_set_header   X-Real-IP        $remote_addr;
 proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

代碼裡面通過Request.Headers["X-Real-IP"],就能擷取到真實ip

6.nginx實現靜態檔案(image,js,css)緩衝

在server節點下添加新的localtion
 #靜態資源緩衝設定
 location ~ \.(jpg|png|jpeg|bmp|gif|swf|css)$
        {
            expires 30d;
            root /nginx-1.9.3/html;#root:  #靜態檔案存在地址,這裡設定在/nginx-1.9.3/html下
            break;
        }

這是index頁面的代碼 <li><img src="/images/1.jpg"/></li>




總結

通過nginx我們實現了一個簡單的負載平衡,實際情況比這複雜很多。比如nginx伺服器掛了,那我們的網站就直接掛了,正確的通過keepalived組件來搭建多台nginx服務提供服務。本篇只做為分布式系統的開篇,後續會陸續推出Redis緩衝,資料庫實現分布式架構的文章,敬請期待!希望能夠得到部落格園分布式大牛的指導。


另外一篇 Nginx 在windows下配合iis搭建負載平衡過程 也是值得分享的

因為項目遇到大量圖片儲存問題,雖然現在我們圖片還不是很多(目前在1T上下,預計增長速度每年1.3倍的增長速度),自己在思考如何有效地儲存大量圖片時,尋找一些資料,看到了,有人使用 Nginx搭建伺服器,本著學習的目的,自己也親自去體驗了一下nginx在window下的安裝過程,並配合iis搭建一個負載平衡的過程,環境如下:


解釋一下,因為我自己就一台電腦,為了示範效果,所以安裝了虛擬機器。

電腦A : 本電腦上安裝Nginx 同時也會配置IIS,為了不和Nginx的80連接埠衝突,務必要修改連接埠號碼,跟虛擬機器B 配合,相當於2台伺服器,來做負載平衡

虛擬機器B: 類比一台伺服器,建立IIS,連接埠號碼使用80連接埠。

下面來說一下安裝過程已經用到的資源

虛擬機器資源:

迅雷下載地址:http://6.jsdx3.crsky.com/software1/VMwareworkstation-v9.0.1.zip

VM使用指南資料: http://open-source.blog.163.com/blog/static/1267734512010714103659611/

Windows鏡像資源:http://www.jb51.net/os/windows/Win2003/1904.html

Nginx資源:

中文nginx:http://www.ostools.net/apidocs/apidoc?api=nginx-zh

安裝Nginx

1. 下載好後,解壓檔案到你指定的目錄,不一定放在C:\ 下面,我自己就放在了


也是可以的,就是在啟動時,需要CMD命令定位到 D:\program\nginx 目錄下才可以

注意:本人下載的是 nginx-1.2.1 這個版本,解壓後,將檔案名稱nginx-1.2.1修改為nginx

2. 在正式安裝前呢,先配置一下,開啟目錄下 的 conf/nginx.conf檔案


然後修改


將這裡的 80 修改為 任意連接埠號碼,我這裡修改為8090.

3. 開啟CMD 命令列工具,進入到nginx安裝目錄下,我這裡就是 D:\program\nginx


然後輸入:nginx


斷行符號,沒有任何提示,說明安裝成功了,瀏覽器輸入 127.0.0.1:8090


就算成功了一小步。

關閉Nginx的命令為 : nginx ?s stop

4. 接下來就是要配置一下伺服器了,記得將剛才修改的conf/nginx.conf檔案 還原回去,避免後面設定時發生混亂

前面說過了,我將Nginx 安裝在了192.168.21.1 電腦上,那就先來配置這個上面的IIS,建立一個測試網站 www.nginxtest.com 連接埠為801


這個網站下面放置了一個 index.html 頁面

5. 配置虛擬機器上的IIS, 同上 ,唯一的區別就是連接埠號碼設定為 80 就可以了。

6. 修改nginx的設定檔 conf/nginx.conf 修改後的結果為:


這裡詳細說明一下:

A地區, 這裡的 upstream 是加進去的,必須加在 server {} 這個節點配置之前

這個表示的是 有2台機器來做負載平衡的。www.nginxtest.com 是我自己配置的測試網站

B地區, 這裡配置的是nginx監聽的連接埠,這裡用的是預設配置80連接埠,以及Nginx所在伺服器IP,我這裡是 192.168.21.1

C地區, 要代理的網域名稱

配置完成後,再次啟動nginx,這裡進程裡會有2個NGINX


瀏覽器輸入地址: www.nginxtest.com

多重新整理幾次就會出現如下2種情況,就達到了2天服務負載平衡的效果了


多重新整理幾次,這個會交替出現。 大功告成!


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.