nginx+iis實現(xiàn)簡單的負載均衡
最近在研究分布式系統(tǒng)架構(gòu)方面的知識,包括負載均衡,數(shù)據(jù)庫讀寫分離,分布式緩存redis等。本篇先從負載均衡服務(wù)架構(gòu)入手,關(guān)于負載均衡百度百科的定義如下:負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執(zhí)行,例如Web服務(wù)器、FTP服務(wù)器、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)。
我的解釋:一項任務(wù)交由一個開發(fā)人員處理總會有上限處理能力,這時可以考慮增加開發(fā)人員來共同處理這項任務(wù),多人處理同一項任務(wù)時就會涉及到調(diào)度問題,即任務(wù)分配,這和多線程理念是一致的。nginx在這里的角色相當于任務(wù)分配者。
閱讀目錄
nginx安裝
站點搭建及配置
問題分析
總結(jié)
一、nginx安裝
Nginx是一款輕量級的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個BSD-like 協(xié)議下發(fā)行。由俄羅斯的程序設(shè)計師Igor Sysoev所開發(fā),供俄國大型的入口網(wǎng)站及搜索引擎Rambler(俄文:Рамблер)使用。其特點是占有內(nèi)存少,并發(fā)能力強,事實上nginx的并發(fā)能力確實在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好,中國大陸使用nginx網(wǎng)站用戶有:百度、新浪、網(wǎng)易、騰訊等。
最新版本的nginx版本為1.9.3,我這下載的是window版本的,一般實際場景都是安裝在linux系統(tǒng)下的,由于linux系統(tǒng)目前正在摸索中這里就不介紹。官方下載地址:nginx-1.9.3.zip 。下載完成之后解壓運行nginx.exe就啟動了nginx了,啟動后會在進程里面看到nginx。
要實現(xiàn)負載均衡需要修改conf/nginx.conf的配置信息,修改配置信息之后重新啟動nginx服務(wù),可以通過nginx -s reload指令實現(xiàn)。這里我們使用 Ants 提供的一個批處理來操作。
將nginx.bat文件放到nginx.exe相同文件夾下,直接運行就行了。文章結(jié)尾會提供本文用到的所有文件。
二、站點搭建及配置
1.搭建兩個iis站點
站點下只有一個簡單的index頁面,用來輸出當前服務(wù)器信息。由于我沒有兩臺機器,所以將兩個站點都部署到本機了,分別綁定了8082和9000兩個端口。
protected void Page_Load(object sender, EventArgs e) { Label0.Text = "請求開始時間:"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); Label1.Text = "服務(wù)器名稱:" + Server.MachineName;//服務(wù)器名稱 Label2.Text = "服務(wù)器IP地址:" + Request.ServerVariables["LOCAL_ADDR"];//服務(wù)器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 = "服務(wù)器操作系統(tǒng)版本:" + Environment.OSVersion.ToString();//服務(wù)器操作系統(tǒng)版本 Label6.Text = "服務(wù)器IIS版本:" + Request.ServerVariables["SERVER_SOFTWARE"];//服務(wù)器IIS版本 Label7.Text = "服務(wù)器域名:" + Request.ServerVariables["SERVER_NAME"];//服務(wù)器域名 Label8.Text = "虛擬目錄的絕對路徑:" + Request.ServerVariables["APPL_RHYSICAL_PATH"];//虛擬目錄的絕對路徑 Label9.Text = "執(zhí)行文件的絕對路徑:" + Request.ServerVariables["PATH_TRANSLATED"];//執(zhí)行文件的絕對路徑 Label10.Text = "虛擬目錄Session總數(shù):" + Session.Contents.Count.ToString();//虛擬目錄Session總數(shù) Label11.Text = "虛擬目錄Application總數(shù):" + Application.Contents.Count.ToString();//虛擬目錄Application總數(shù) Label12.Text = "域名主機:" + Request.ServerVariables["HTTP_HOST"];//域名主機 Label13.Text = "服務(wù)器區(qū)域語言:" + Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"];//服務(wù)器區(qū)域語言 Label14.Text = "用戶信息:" + Request.ServerVariables["HTTP_USER_AGENT"]; Label14.Text = "CPU個數(shù):" + Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS");//CPU個數(shù) 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端口已經(jīng)被占用,我改為監(jiān)聽8083端口。
listen 8083;
在http節(jié)點下添加upstream(服務(wù)器集群),server設(shè)置的是集群服務(wù)器的信息,我這里搭建了兩個站點,配置了兩條信息。
#服務(wù)器集群名稱為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 對應(yīng)著upstream設(shè)置的集群名稱 proxy_pass http://Jq_one; #設(shè)置主機頭和客戶端真實地址,以便服務(wù)器獲取客戶端真實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服務(wù),最終完整配置文件信息如下
3.運行結(jié)果
訪問http://127.0.0.1:8083/index.aspx ,多訪問幾次,著重關(guān)注標紅部分。
可以看到,我們的請求被分發(fā)到了8082站點和9000站點,并且第一次是8082站點第二次9000。出現(xiàn)這樣的結(jié)果證明我們負載均衡搭建成功了。 嘗試關(guān)閉其中的9000站點,然后刷新頁面發(fā)現(xiàn)輸出的http端口一直是8082,也就是說其中一個站點掛了,只要還有一個站點是好的,我們的還是可以服務(wù)。
四、問題分析
雖然我們搭建好了負載均衡站點,但是還存在以下問題。
1.如果站點使用了session,請求平均分配到兩個站點,那么必然存在session共享問題,該如何解決?
使用數(shù)據(jù)庫保存session信息
使用nginx將同一ip的請求分配到固定服務(wù)器,修改如下。ip_hash會計算ip對應(yīng)hash值,然后分配到固定服務(wù)器
upstream Jq_one{ server 127.0.0.1:8082 ; server 127.0.0.1:9000 ; ip_hash; }
搭建一臺Redis服務(wù)器,對session的讀取都從該Redis服務(wù)器上讀取。后面的文章將介紹分布式緩存Redis的使用
2.管理員更新站點文件,該怎么操作,現(xiàn)在還只有兩臺服務(wù)器,可以手工將文件更新到兩臺服務(wù)器,如果是10臺呢,那么手工操作必然是不可行的
多服務(wù)器站點更新可以使用GoodSync 文件同步程序,會自動檢測文件的修改新增,然后同步到其它服務(wù)器上。在linux下可以使用rsync
3.站點中的文件上傳功能會將文件分配到不同的服務(wù)器,文件共享問題如何解決。
使用文件服務(wù)器將所有文件存儲到該服務(wù)器上,文件操作讀取寫入都在該服務(wù)器上。這里同樣會存在一個問題,文件服務(wù)器存在讀寫上限。
4.負載的服務(wù)器配置不一樣,有的高有的低可不可以讓配置高的服務(wù)器處理請求多一些
這里講一下,負載均衡有好幾種算法 輪轉(zhuǎn)法,散列法, 最少連接法,最低缺失法,最快響應(yīng)法,加權(quán)法。我們這里可以使用加權(quán)法來分配請求。
upstream Jq_one{ server 127.0.0.1:8082 weight=4; server 127.0.0.1:9000 weight=1; }
通過weight設(shè)置每臺服務(wù)器分配請求站的權(quán)重,值越高分配的越多。
5.由于請求是經(jīng)過nginx轉(zhuǎn)發(fā)過來的,可以在代碼里面獲取到用戶請求的實際ip地址嗎?
答案是肯定的,在localtion節(jié)點設(shè)置如下請求頭信息
#設(shè)置主機頭和客戶端真實地址,以便服務(wù)器獲取客戶端真實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實現(xiàn)靜態(tài)文件(image,js,css)緩存
在server節(jié)點下添加新的localtion
#靜態(tài)資源緩存設(shè)置 location ~ \.(jpg|png|jpeg|bmp|gif|swf|css)$ { expires 30d; root /nginx-1.9.3/html;#root: #靜態(tài)文件存在地址,這里設(shè)置在/nginx-1.9.3/html下 break; }
這是index頁面的代碼 <li><img src="/images/1.jpg"/></li>
總結(jié)
通過nginx我們實現(xiàn)了一個簡單的負載均衡,實際情況比這復(fù)雜很多。比如nginx服務(wù)器掛了,那我們的站點就直接掛了,正確的通過keepalived組件來搭建多臺nginx服務(wù)提供服務(wù)。本篇只做為分布式系統(tǒng)的開篇,后續(xù)會陸續(xù)推出Redis緩存,數(shù)據(jù)庫實現(xiàn)分布式架構(gòu)的文章,敬請期待!
- iis+nginx實現(xiàn)負載均衡的詳細步驟
- iis、apache、nginx使用X-Frame-Options防止網(wǎng)頁被Frame的解決方法
- Windows安裝nginx1.10.1反向代理訪問IIS網(wǎng)站
- 采用軟件負載均衡器實現(xiàn)web服務(wù)器集群(iis+nginx)
- nginx、Apache、IIS服務(wù)器解決 413 Request Entity Too Large問題方法匯總
- IIS、Apache、Nginx下用IE下載apk文件變成zip的解決辦法
- 讓iis記錄nginx反向代理的真實ip
- Nginx反向代理+DNS輪詢+IIS7.5 千萬PV 百萬IP 雙線 網(wǎng)站架構(gòu)案例
- iis、apache與nginx禁止目錄執(zhí)行asp、php腳本的實現(xiàn)方法
- Nginx+IIS簡單的部署教程
相關(guān)文章
Nginx服務(wù)器配置HTTPS nginx.config 配置文件(教程)
下面小編就為大家分享一篇Nginx服務(wù)器配置HTTPS nginx.config 配置文件(教程),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12Nginx服務(wù)器中強制使用緩存的配置及緩存優(yōu)先級的講解
這篇文章主要介紹了Nginx服務(wù)器中強制使用緩存的配置及緩存優(yōu)先級的講解,一定程度上可以幫助大家解決Nginx不緩存或緩存失效的問題,需要的朋友可以參考下2016-01-01