Nginx+IIS簡(jiǎn)單的部署教程
隨著互聯(lián)網(wǎng)項(xiàng)目用戶(hù)訪(fǎng)問(wèn)量不斷上升,單點(diǎn)web服務(wù)器是無(wú)法滿(mǎn)足大型高并發(fā)高負(fù)載的業(yè)務(wù)處理的,為了給web服務(wù)器做負(fù)載均衡方案,打算采用Nginx搭建負(fù)載均衡服務(wù)器,把用戶(hù)請(qǐng)求分配到N個(gè)服務(wù)器來(lái)緩解服務(wù)器壓力。
Nginx簡(jiǎn)介:
Nginx (“engine x”) 是一個(gè)高性能的 HTTP 和 反向代理 服務(wù)器,也是一個(gè) IMAP/POP3/SMTP 代理服務(wù)器 。 Nginx 是由 Igor Sysoev 為俄羅斯訪(fǎng)問(wèn)量第二的Rambler.ru 站點(diǎn)開(kāi)發(fā)的,它已經(jīng)在該站點(diǎn)運(yùn)行超過(guò)四年多了。Igor 將源代碼以類(lèi)BSD許可證的形式發(fā)布。自Nginx 發(fā)布四年來(lái),Nginx 已經(jīng)因?yàn)樗姆€(wěn)定性、豐富的功能集、 示例配置文件和低系統(tǒng)資源的消耗而聞名了。目前國(guó)內(nèi)各大門(mén)戶(hù)網(wǎng)站已經(jīng)部署了Nginx,如新浪、網(wǎng)易、騰訊等;國(guó)內(nèi)幾個(gè)重要的視頻分享網(wǎng)站也部署了Nginx,如六房間、酷6等。 新近發(fā)現(xiàn)Nginx 技術(shù)在國(guó)內(nèi)日趨火熱,越來(lái)越多的網(wǎng)站開(kāi)始部署Nginx。這邊都是網(wǎng)上說(shuō)的。
nginx安裝
Nginx是一款輕量級(jí)的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個(gè)BSD-like 協(xié)議下發(fā)行。由俄羅斯的程序設(shè)計(jì)師Igor Sysoev所開(kāi)發(fā),供俄國(guó)大型的入口網(wǎng)站及搜索引擎Rambler(俄文:Рамблер)使用。其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上nginx的并發(fā)能力確實(shí)在同類(lèi)型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好,中國(guó)大陸使用nginx網(wǎng)站用戶(hù)有:百度、新浪、網(wǎng)易、騰訊等。
最新版本的nginx版本為1.9.3,我這下載的是window版本的,一般實(shí)際場(chǎng)景都是安裝在linux系統(tǒng)下的,由于linux系統(tǒng)目前正在摸索中這里就不介紹。官方下載地址:nginx-1.9.3.zip。下載完成之后解壓運(yùn)行nginx.exe就啟動(dòng)了nginx了,啟動(dòng)后會(huì)在進(jìn)程里面看到nginx。
要實(shí)現(xiàn)負(fù)載均衡需要修改conf/nginx.conf的配置信息,修改配置信息之后重新啟動(dòng)nginx服務(wù),可以通過(guò)nginx -s reload指令實(shí)現(xiàn)。這里我們使用Ants提供的一個(gè)批處理來(lái)操作。
將nginx.bat文件放到nginx.exe相同文件夾下,直接運(yùn)行就行了。文章結(jié)尾會(huì)提供本文用到的所有文件。
站點(diǎn)搭建及配置
1.搭建兩個(gè)iis站點(diǎn)
站點(diǎn)下只有一個(gè)簡(jiǎn)單的index頁(yè)面,用來(lái)輸出當(dāng)前服務(wù)器信息。由于我沒(méi)有兩臺(tái)機(jī)器,所以將兩個(gè)站點(diǎn)都部署到本機(jī)了,分別綁定了8082和9000兩個(gè)端口。
protected void Page_Load(object sender, EventArgs e) { Label0.Text = "請(qǐng)求開(kāi)始時(shí)間:"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); Label1.Text = "服務(wù)器名稱(chēng):" + Server.MachineName;//服務(wù)器名稱(chēng) Label2.Text = "服務(wù)器IP地址:" + Request.ServerVariables["LOCAL_ADDR"];//服務(wù)器IP地址 Label3.Text = "HTTP訪(fǎng)問(wèn)端口:" + Request.ServerVariables["SERVER_PORT"];//HTTP訪(fǎng)問(wèn)端口" 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 = "虛擬目錄的絕對(duì)路徑:" + Request.ServerVariables["APPL_RHYSICAL_PATH"];//虛擬目錄的絕對(duì)路徑 Label9.Text = "執(zhí)行文件的絕對(duì)路徑:" + Request.ServerVariables["PATH_TRANSLATED"];//執(zhí)行文件的絕對(duì)路徑 Label10.Text = "虛擬目錄Session總數(shù):" + Session.Contents.Count.ToString();//虛擬目錄Session總數(shù) Label11.Text = "虛擬目錄Application總數(shù):" + Application.Contents.Count.ToString();//虛擬目錄Application總數(shù) Label12.Text = "域名主機(jī):" + Request.ServerVariables["HTTP_HOST"];//域名主機(jī) Label13.Text = "服務(wù)器區(qū)域語(yǔ)言:" + Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"];//服務(wù)器區(qū)域語(yǔ)言 Label14.Text = "用戶(hù)信息:" + Request.ServerVariables["HTTP_USER_AGENT"]; Label14.Text = "CPU個(gè)數(shù):" + Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS");//CPU個(gè)數(shù) Label15.Text = "CPU類(lèi)型:" + Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER");//CPU類(lèi)型 Label16.Text = "請(qǐng)求來(lái)源地址:" + Request.Headers["X-Real-IP"]; }
2.修改nginx配置信息
修改nginx監(jiān)聽(tīng)端口,修改http server下的listen節(jié)點(diǎn)值,由于本機(jī)80端口已經(jīng)被占用,我改為監(jiān)聽(tīng)8083端口。
listen 8083;
在http節(jié)點(diǎn)下添加upstream(服務(wù)器集群),server設(shè)置的是集群服務(wù)器的信息,我這里搭建了兩個(gè)站點(diǎn),配置了兩條信息。
#服務(wù)器集群名稱(chēng)為Jq_one upstream Jq_one { server 127.0.0.1:9000; server 127.0.0.1:8082; }
在http節(jié)點(diǎn)下找到location節(jié)點(diǎn)修改
location / { root html; index index.aspx index.html index.htm; #修改主頁(yè)為index.aspx #其中jq_one對(duì)應(yīng)著upstream設(shè)置的集群名稱(chēng) proxy_pass http://Jq_one; #設(shè)置主機(jī)頭和客戶(hù)端真實(shí)地址,以便服務(wù)器獲取客戶(hù)端真實(shí)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.運(yùn)行結(jié)果
訪(fǎng)問(wèn)http://127.0.0.1:8083/index.aspx ,多訪(fǎng)問(wèn)幾次,著重關(guān)注標(biāo)紅部分。
可以看到,我們的請(qǐng)求被分發(fā)到了8082站點(diǎn)和9000站點(diǎn),并且第一次是8082站點(diǎn)第二次9000。出現(xiàn)這樣的結(jié)果證明我們負(fù)載均衡搭建成功了。嘗試關(guān)閉其中的9000站點(diǎn),然后刷新頁(yè)面發(fā)現(xiàn)輸出的http端口一直是8082,也就是說(shuō)其中一個(gè)站點(diǎn)掛了,只要還有一個(gè)站點(diǎn)是好的,我們的還是可以服務(wù)。
問(wèn)題分析
雖然我們搭建好了負(fù)載均衡站點(diǎn),但是還存在以下問(wèn)題。
1.如果站點(diǎn)使用了session,請(qǐng)求平均分配到兩個(gè)站點(diǎn),那么必然存在session共享問(wèn)題,該如何解決?
使用數(shù)據(jù)庫(kù)保存session信息使用nginx將同一ip的請(qǐng)求分配到固定服務(wù)器,修改如下。ip_hash會(huì)計(jì)算ip對(duì)應(yīng)hash值,然后分配到固定服務(wù)器
upstream Jq_one{
server 127.0.0.1:8082 ;
server 127.0.0.1:9000 ;
ip_hash;
}
搭建一臺(tái)Redis服務(wù)器,對(duì)session的讀取都從該Redis服務(wù)器上讀取。后面的文章將介紹分布式緩存Redis的使用
2.管理員更新站點(diǎn)文件,該怎么操作,現(xiàn)在還只有兩臺(tái)服務(wù)器,可以手工將文件更新到兩臺(tái)服務(wù)器,如果是10臺(tái)呢,那么手工操作必然是不可行的
多服務(wù)器站點(diǎn)更新可以使用GoodSync 文件同步程序,會(huì)自動(dòng)檢測(cè)文件的修改新增,然后同步到其它服務(wù)器上。在linux下可以使用rsync
3.站點(diǎn)中的文件上傳功能會(huì)將文件分配到不同的服務(wù)器,文件共享問(wèn)題如何解決。
使用文件服務(wù)器將所有文件存儲(chǔ)到該服務(wù)器上,文件操作讀取寫(xiě)入都在該服務(wù)器上。這里同樣會(huì)存在一個(gè)問(wèn)題,文件服務(wù)器存在讀寫(xiě)上限。
4.負(fù)載的服務(wù)器配置不一樣,有的高有的低可不可以讓配置高的服務(wù)器處理請(qǐng)求多一些
這里講一下,負(fù)載均衡有好幾種算法 輪轉(zhuǎn)法,散列法,最少連接法,最低缺失法,最快響應(yīng)法,加權(quán)法。我們這里可以使用加權(quán)法來(lái)分配請(qǐng)求。
upstream Jq_one{
server 127.0.0.1:8082 weight=4;
server 127.0.0.1:9000 weight=1;
}
通過(guò)weight設(shè)置每臺(tái)服務(wù)器分配請(qǐng)求站的權(quán)重,值越高分配的越多。
5.由于請(qǐng)求是經(jīng)過(guò)nginx轉(zhuǎn)發(fā)過(guò)來(lái)的,可以在代碼里面獲取到用戶(hù)請(qǐng)求的實(shí)際ip地址嗎?
答案是肯定的,在localtion節(jié)點(diǎn)設(shè)置如下請(qǐng)求頭信息
#設(shè)置主機(jī)頭和客戶(hù)端真實(shí)地址,以便服務(wù)器獲取客戶(hù)端真實(shí)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;
代碼里面通過(guò)Request.Headers["X-Real-IP"],就能獲取到真實(shí)ip
以上代碼來(lái)自:nginx+iis實(shí)現(xiàn)簡(jiǎn)單的負(fù)載均衡
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- iis+nginx實(shí)現(xiàn)負(fù)載均衡的詳細(xì)步驟
- iis、apache、nginx使用X-Frame-Options防止網(wǎng)頁(yè)被Frame的解決方法
- Windows安裝nginx1.10.1反向代理訪(fǎng)問(wèn)IIS網(wǎng)站
- 采用軟件負(fù)載均衡器實(shí)現(xiàn)web服務(wù)器集群(iis+nginx)
- nginx+iis實(shí)現(xiàn)簡(jiǎn)單的負(fù)載均衡
- nginx、Apache、IIS服務(wù)器解決 413 Request Entity Too Large問(wèn)題方法匯總
- IIS、Apache、Nginx下用IE下載apk文件變成zip的解決辦法
- 讓iis記錄nginx反向代理的真實(shí)ip
- Nginx反向代理+DNS輪詢(xún)+IIS7.5 千萬(wàn)PV 百萬(wàn)IP 雙線(xiàn) 網(wǎng)站架構(gòu)案例
- iis、apache與nginx禁止目錄執(zhí)行asp、php腳本的實(shí)現(xiàn)方法
相關(guān)文章
ubuntu上配置Nginx+PHP5 FastCGI服務(wù)器配置
ubuntu上配置Nginx+PHP5 FastCGI服務(wù)器配置方法, 需要的朋友可以參考下。2010-06-06關(guān)于nginx報(bào)錯(cuò)405?not?allowed解決方法總結(jié)
這篇文章主要給大家介紹了關(guān)于nginx報(bào)錯(cuò)405?not?allowed解決方法的相關(guān)資料,nginx遇到post請(qǐng)求靜態(tài)文件會(huì)得到405錯(cuò)誤,文中通過(guò)代碼介紹的非常詳細(xì),也給出了推薦方法,需要的朋友可以參考下2023-10-10深入解析nginx路由location匹配規(guī)則及其優(yōu)先級(jí)
Nginx是一款高性能的Web服務(wù)器和反向代理服務(wù)器,它的路由功能是通過(guò)location指令來(lái)實(shí)現(xiàn)的,location指令用于匹配請(qǐng)求的URL,并將請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的處理程序或靜態(tài)文件,需要的朋友可以參考下2023-10-10nginx使用ssl模塊配置支持HTTPS訪(fǎng)問(wèn)的方法
這篇文章主要介紹了nginx使用ssl模塊配置支持HTTPS訪(fǎng)問(wèn)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Nginx?504?Gateway?Time-out的兩種最新解決方案
大家在訪(fǎng)問(wèn)網(wǎng)站的時(shí)候通常會(huì)遇到502錯(cuò)誤、404錯(cuò)誤等,很少會(huì)遇到504錯(cuò)誤,但是在我們?nèi)ピL(fǎng)問(wèn)大流量或者內(nèi)容數(shù)據(jù)量較多的網(wǎng)站時(shí),打開(kāi)網(wǎng)頁(yè)偶爾就會(huì)出現(xiàn)504 gateway time-out,這篇文章主要給大家介紹了關(guān)于Nginx?504?Gateway?Time-out的兩種解決方案,需要的朋友可以參考下2022-08-08