IIS綁定域名導(dǎo)致應(yīng)用程序重啟的解決方案
這個(gè)問題比較小眾,卻是不好解決,在將多個(gè)站點(diǎn)遷移到一個(gè)站點(diǎn)(Tenant Feature)的時(shí)候碰到了一個(gè)棘手的問題,用戶需要綁定自定義域名,但I(xiàn)IS綁定域名的時(shí)候會(huì)導(dǎo)致這個(gè)站點(diǎn)重啟,那么只要一個(gè)用戶綁定了一個(gè)域名則會(huì)導(dǎo)致這個(gè)應(yīng)用上的其它租戶都會(huì)受到影響,下面寫出我們的解決方案,但不一定是最優(yōu)的。
問題在IIS上綁定域名導(dǎo)致應(yīng)用程序重啟
一個(gè)簡單的測試
1.新建一個(gè)空MVC項(xiàng)目,在MvcApplication類中定義一個(gè)全局的靜態(tài)變量
2.創(chuàng)建一個(gè)控制器和視圖
3.在視圖頁對(duì)MvcApplication中的Count進(jìn)行++并輸出
4.訪問幾次頁面
5.綁定一個(gè)域名
6.刷新頁面
至此驗(yàn)證完成,可以看到應(yīng)用被重啟了。
為什么綁定域名會(huì)導(dǎo)致應(yīng)用程序重啟
其實(shí)原理和更改Web.config文件會(huì)導(dǎo)致應(yīng)用重啟啟動(dòng)是一樣的,因?yàn)榻壎ㄓ蛎麜r(shí)實(shí)際在C:\Windows\System32\inetsrv\config\applicationHost.config文件中增加一了一段配置,如下:
使用Nginx解決問題
為了解決這個(gè)問題可謂是找了很多資料,最終無奈使用一個(gè)代理服務(wù)器來解決這個(gè)問題,雖然我覺得在這里Nginx受了委屈,因?yàn)樗蟮淖饔檬秦?fù)載均衡,但能解決問題就行,以后在大訪問量的時(shí)候也可以派上用場,下面就簡述下使用Nginx解決這個(gè)問題的過程。
原理其實(shí)非常簡單,在用戶訪問一個(gè)Url時(shí)由Nginx去分配,這樣域名就可以不用直接綁定在IIS上,而由Nginx來分配域名指向哪里。
提前在IIS上綁定無數(shù)個(gè)泛解析域名
比如:site1.cs.xxx.com~site9999999.cs.xxx.com,這樣就免去了在新增Tenant時(shí)需要綁定域名的尷尬。
將綁定自定義域名的動(dòng)作交給Nginx
Nginx沒有提供什么API,只有一個(gè)配置文件和幾個(gè)命令,所以我們要做的就是將在Nginx上配置域名的動(dòng)作自動(dòng)化,我們?yōu)榇藢懥艘粋€(gè)Daemon Service來完成這個(gè)動(dòng)作,下面會(huì)介紹并放出這個(gè)守護(hù)程序的使用說明及源碼。
這樣IIS綁定域名的問題就解決了,但其實(shí)在這個(gè)方案之前我們還有過其他的方案。
被Pass掉的方案
1.一臺(tái)服務(wù)器只掛一個(gè)站點(diǎn),而這個(gè)站點(diǎn)不綁定任何域名,所有指向這個(gè)服務(wù)器IP的80端口的請(qǐng)求全部由這個(gè)站來響應(yīng)。
Pass原因:浪費(fèi)資源,80端口被極大的浪費(fèi)。
2.每天定點(diǎn)綁定域名
Pass原因:用戶綁完域名后生效時(shí)間不確定,可能需要等到晚上12點(diǎn)之后才能生效。
Nginx自動(dòng)化配置
Server
守護(hù)服務(wù)的主要原理是這樣的,守護(hù)服務(wù)提供一個(gè)WCF服務(wù),這個(gè)WCF服務(wù)中有兩個(gè)操作,綁定域名和刪除域名,服務(wù)約束如下:
具體實(shí)現(xiàn)代碼就不演示了。
使用說明
1.配置守護(hù)服務(wù)(App.config)
主要有兩個(gè)配置:
NginxPath:Nginx的存放路徑,因?yàn)槲乙业脚渲梦募蚽ginx.exe,你懂的。
RunModel:因?yàn)镹ginx只提供了命令行的模式去執(zhí)行,所以我需要借助PowerShell或CMD,注意如果使用PowerShell,則PowerShell的版本必須為3.0及以上。
2.配置Nginx
因?yàn)镹ginx默認(rèn)的配置文件中有很多配置,所以我們單獨(dú)把域名的配置獨(dú)立出來,這就需要對(duì)Nginx原有的配置進(jìn)行一些修改。
打開nginx-1.7.2\conf\nginx.conf文件,在http節(jié)點(diǎn)下添加配置 include custom.conf;
到這里我們的配置就完成了,接下來啟動(dòng)服務(wù)。
Client
1.添加服務(wù)引用
2.添加如下測試代碼
運(yùn)行之后會(huì)發(fā)現(xiàn)nginx-1.7.2\conf\下多出了一個(gè)custom.conf文件。
內(nèi)容為:
到這里我們就測試通過啦,如果想看效果請(qǐng)自行hosts映射test1.com和test2.com到本地IP。
為了防止綁定失敗我們同時(shí)在服務(wù)的根目錄下保存了domains.xml文件,域名的綁定信息也會(huì)在此保留,這樣大家就可以自己還原啦。
Daemon Service Source Code
http://files.cnblogs.com/ants/ChunSun.NginxServer.DaemonService.zip
說明:該源碼是我精簡過后的,原來的源碼是基于Rabbit Kernel的,所以精簡后的源碼沒有提供日志等功能的支持,大家可以自行添加。
關(guān)鍵詞:IIS,解決方案
閱讀本文后您有什么感想? 已有 人給出評(píng)價(jià)!
- 0
- 0
- 0
- 0
- 0
- 0