架構之路:nginx與IIS服務器搭建集群實現負載均衡(三)
參考網址:https://blog.csdn.net/zhanghan18333611647/article/details/50811980
【前言】
在《架構之路:nginx與IIS服務器搭建集群實現負載均衡(二)》中提到有好多有趣的地方,接下來就為大家一塊兒講講在深入研究過程中遇到那些有趣的事情。
·實戰之行——發現問題
·探索之旅——尋出問題原因
·解決之道——解決問題
【實戰之行】
在《架構之路:nginx與IIS服務器搭建集群實現負載均衡(二)》中做了小Demo,當時做出來後很興奮,於是一鼓作氣,用實戰來檢驗。
實驗前就雄心勃勃,Nginx確實大有來頭(詳情:猛擊me),堅信這個東西可以弄成。
於是馬不停蹄進入實戰,這次實戰是拿之前做的廊坊一中項目來進行的。
(1)在IIS上將廊坊一中系統發布兩份【端口:一中A為8030;一中B為8040】(註:為了做接下來實驗,將發布兩個網站首頁進行了區別—一中A的登錄界面以及主界面有8030標識,一中B登錄界面以及主界面有8040標識)如下截圖:
(2)為了保證接下來實驗正確性,先單獨瀏覽兩個網站確認發布沒有問題,如下截圖:
(3)配置好Nginx,由於和上篇博客配置過程一樣,在此不再贅述。
(4)訪問Nginx的監控端口8090——》出的登錄界面是8030網站提供的——》輸入用戶名和密碼點擊登錄;如下截圖:
(5)預想是出現系統主界面,但是奇怪的現象發生,沒有進入系統的主界面;而是返回8040的登錄界面,如下圖所示:
【探索之旅】
遇到問題就沖上去去探索去解決,往往能有意想不到的收獲。
(一)本實驗的基本架構如下圖:
為什麽會出現上述那種情況,由於學到的知識有限自己百思不得其解;根據自己之前的探究經驗——想不明白原理情況下就去做猜想並做相應的實驗去驗證。
於是乎就開始了自己實驗的探索之旅。
(二)探索五階段
(1)第一階段:開始的時候因為沒有方向,就改配置瞎測試——改Nginx比重實驗、同一臺電腦不同瀏覽器實驗、不同電腦來訪問的實驗、、、、
(2)第二階段:總結第一階段——盲目的這樣做實驗並沒有好的效果;於是乎就改變方向,去網上查和別人交流。在這個過程中收獲許多知識,比如:對Session和Cookie的理解,網站訪問的來龍去脈等等。
最後確認這個問題屬於Session共享問題。並做出猜想:由於Nginx服務比重配置為1:1,則輪流給客戶端提供服務;當登錄時將相應Session信息記錄在IIS服務器8030時,當輪到8040給客戶端提供服務時讀不到這個Session信息而導致實戰中遇到現象。
(3)第三階段:有了猜想後,根據猜想做了比較有針對性的實驗:
①刷新出8030的登錄界面——》填寫用戶A和其對應密碼點擊登錄——》得到8040的登錄界面——》再次輸入用戶A和其對應密碼點擊登錄——》進入8030的主界面。
②刷新出8030的登錄界面——》填寫用戶A和其對應密碼點擊登錄——》得到8040的登錄界面——》再次輸入用戶B和其對應密碼點擊登錄——》得到8030的登錄界面。此後只要刷出8040的登錄界面就能用用戶A登錄到8030的主界面,刷出8030登錄界面用用戶B就能進入8040的主界面。
通過這兩個實驗驗證上面自己的猜想,不過針對具體的過程自己還是比較模糊。
(4)第四階段:通過代碼來驗證,廊坊一中是用MVC來做的,下面就是登錄這條線的代碼分析:
①用戶輸入用戶名和密碼後去訪問登錄的Controller,如下圖示:
②登錄Controller接受住用戶名後進行校驗;若成功則返回成功標識,如下圖所示:
③登錄頁面接受到成功標識後再次申請訪問主頁面Controller,如下圖所示:
④主頁面的Controller對來訪問的請求先進行攔截,如下圖所示:
⑤攔截後,檢查是否有相應的Session信息;若有則進入主頁,若沒有則返回登錄頁面,如下圖:
(5)第五階段:實驗和代碼相結合,再次從原理上描述出現實戰中的情況;用圖來對上述實驗進行再現:
【解決之道】
通過探索明白了問題產生的根本在於Session沒有共享;
接下來就是如何去解決該問題;通過上網查找以及和別人交流,經過不懈的嘗試最終找到了利用另外一臺服務器來存儲Session從而實現Session共享來解決這個問題。
有了上面的基礎這次從 原理——》實現——》實驗驗證
(一)原理:
(1)基本架構圖改成如下所示:
(2)一次登陸的來龍去脈如下圖所示:
(二)實現:
原理上明白如何解決;接下來就是考慮如何去做?
通過查閱相關資料用SQLServer來做session的存儲,讓網站連上,從而實現Session共享。
(1)建立session數據庫步驟如下:
①執行.Net自帶的腳本,如下圖所示:
②生成相應的數據庫,如下圖:
③為保證8030和8040讀到是同一個Session需將,該庫中的一個存儲過程做修改;見下圖:
④啟動ASP.Net State Service服務(建議將其設為自啟動)
(2)在8030和8040的網站的配置文件中,添加連接該庫的字符串;如下圖所示:
(三)實驗驗證:
(1)重啟兩個網站和Nginx服務(重啟Nginx命令:nginx.exe -s reload)——》用瀏覽器訪問Nginx監聽端口8090——》出現登錄界面——》輸入用戶名和密碼;如下圖所示:
(2)點擊登錄,奇跡出現;見下圖:
(3)刷新主界面,見下圖:
(4)查看數據庫中存儲Session表的數據;如下圖:
架構之路:nginx與IIS服務器搭建集群實現負載均衡(三)