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