nginx+iis如何實現簡單的負載均衡

一、nginx安裝

??? nginx是一款輕量級的web 服務器/反向代理服務器及電子郵件(imap/pop3)代理服務器,并在一個bsd-like 協(xié)議下發(fā)行。由俄羅斯的程序設計師igor sysoev所開發(fā),供俄國大型的入口網站及搜索引擎rambler(俄文:рамблер)使用。其特點是占有內存少,并發(fā)能力強,事實上nginx的并發(fā)能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、新浪、網易、騰訊等。

  最新版本的nginx版本為1.9.3,我這下載的是window版本的,一般實際場景都是安裝在linux系統(tǒng)下的,由于linux系統(tǒng)目前正在摸索中這里就不介紹。官方下載地址:。下載完成之后解壓運行nginx.exe就啟動了nginx了,啟動后會在進程里面看到nginx。

nginx+iis如何實現簡單的負載均衡

?? 要實現負載均衡需要修改conf/nginx.conf的配置信息,修改配置信息之后重新啟動nginx服務,可以通過nginx -s reload指令實現。這里我們使用 ants 提供的一個批處理來操作。

nginx+iis如何實現簡單的負載均衡

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

?nginx+iis如何實現簡單的負載均衡

二、站點搭建及配置

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?=?"服務器操作系統(tǒng)版本:"?+?environment.osversion.tostring();//服務器操作系統(tǒng)版本? ??label6.text?=?"服務器iis版本:"?+?request.servervariables["server_software"];//服務器iis版本? ??label7.text?=?"服務器域名:"?+?request.servervariables["server_name"];//服務器域名? ??label8.text?=?"虛擬目錄的絕對路徑:"?+?request.servervariables["appl_rhysical_path"];//虛擬目錄的絕對路徑? ??label9.text?=?"執(zhí)行文件的絕對路徑:"?+?request.servervariables["path_translated"];//執(zhí)行文件的絕對路徑? ??label10.text?=?"虛擬目錄Session總數:"?+?session.contents.count.tostring();//虛擬目錄session總數? ??label11.text?=?"虛擬目錄application總數:"?+?application.contents.count.tostring();//虛擬目錄application總數? ??label12.text?=?"域名主機:"?+?request.servervariables["http_host"];//域名主機? ??label13.text?=?"服務器區(qū)域語言:"?+?request.servervariables["http_accept_language"];//服務器區(qū)域語言? ??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監(jiān)聽端口,修改http server下的listen節(jié)點值,由于本機80端口已經被占用,我改為監(jiān)聽8083端口。

?? listen?????? 8083;

? 在http節(jié)點下添加upstream(服務器集群),server設置的是集群服務器的信息,我這里搭建了兩個站點,配置了兩條信息。

?#服務器集群名稱為jq_one ?upstream?jq_one?{ ?  server?127.0.0.1:9000;? ?  server?127.0.0.1:8082;? ?}

?在http節(jié)點下找到location節(jié)點修改

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 ,多訪問幾次,著重關注標紅部分。

nginx+iis如何實現簡單的負載均衡

nginx+iis如何實現簡單的負載均衡

可以看到,我們的請求被分發(fā)到了8082站點和9000站點,并且第一次是8082站點第二次9000。出現這樣的結果證明我們負載均衡搭建成功了。 嘗試關閉其中的9000站點,然后刷新頁面發(fā)現輸出的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;   }

???? 通過weight設置每臺服務器分配請求站的權重,值越高分配的越多。

?5.由于請求是經過nginx轉發(fā)過來的,可以在代碼里面獲取到用戶請求的實際ip地址嗎?

答案是肯定的,在localtion節(jié)點設置如下請求頭信息???

?#設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實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實現靜態(tài)文件(image,JS,css)緩存

在server節(jié)點下添加新的localtion

?#靜態(tài)資源緩存設置 ?location?~?.(jpg|png|jpeg|bmp|gif|swf|css)$ ?{? ??expires?30d; ??root?/nginx-1.9.3/html;#root:?#靜態(tài)文件存在地址,這里設置在/nginx-1.9.3/html下 ??break; ?}

??? 這是index頁面的代碼

  • nginx+iis如何實現簡單的負載均衡
  • ? 版權聲明
    THE END
    喜歡就支持一下吧
    點贊13 分享