1. 程式人生 > >架構之路:nginx與IIS服務器搭建集群實現負載均衡(三)

架構之路:nginx與IIS服務器搭建集群實現負載均衡(三)

blog 存儲 bsp 知識 exe ESS 步驟 校驗 con

參考網址: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服務器搭建集群實現負載均衡(三)