負載平衡的 IIS 7.5 Web 伺服器 ASP.NET 會話狀態問題
我們有一個 ASP.NET 網站的問題,其中使用者的會話行為異常 - 會話數據出現、消失和重新出現。
我想我知道問題是什麼:
- 我們的設置是 2 個負載平衡的 WebServers + 單會話狀態數據庫。
- ASP.NET SQL 會話狀態儲存似乎依賴於 IIS 網站實例 ID(元數據庫 ID)來唯一標識傳入會話 cookie ID 並檢索/儲存值。
- 網站的 IIS 網站實例 ID 在每個實時伺服器上都不同(WebServer A 上的 ID /W3SVC/ 1 /Root,Webserver B 上的 ID /W3SVC/2/Root)。
- 負載平衡不使用客戶端關聯,因此每個使用者 HTTP 請求都可以發送到任一伺服器。
因此,當使用者登錄站點並四處走動時,每個 HTTP 呼叫都可以轉到任一 Web 伺服器,因此根據伺服器使用具有不同 ID 的會話狀態記錄。實際上,使用者將同時擁有 2 個單獨的會話實例。我相信我已經在數據庫ASPStateTempSessions表中驗證了這一點,每個會話 cookie ID 似乎對應於 2 個幾乎相同命名的記錄(它們的 ID 僅在最後幾個字元上有所不同,我相信這是基於AppID的修飾符AspStateTempApplications表)在幾秒鐘內創建。
因此,會話狀態似乎行為不端,因為對一個會話記錄所做的更改只會針對該 Web 伺服器持續存在。如果使用者移動到其他負載平衡伺服器,會話值似乎會消失或恢復。
我相信解決方案是同步站點的 IIS 實例 ID(例如,將它們都設為**/W3SVC/1/Root**),但我嘗試在 IIS 中的 Advanced Settings 下編輯該值,雖然它保存了 OK,但它只是使站點在該伺服器上返回 404,直到我將其更改回來。
我為這個問題找到了一個 VBS 腳本,但它似乎只適用於 IIS 6,所以我擔心嘗試它。有沒有其他人在 IIS 7.5 上遇到過這種情況,你是如何解決的?
編輯/解決方案
我的錯誤是我在 IIS 中更改了站點實例 ID 後忘記重新啟動 IIS。在此之後,ID 被更新並且 ASP.NET 會話在兩個 Web 伺服器上同步。
完整說明:
- 遠端桌面到伺服器 LIVE1,打開 IIS Mgr,點擊問題站點並在側欄中選擇高級設置。
- 將 ID 更改為唯一的 ID,例如 10。點擊“確定”。
- 重啟網路服務 (
c:\windows\system32\iisreset /restart
)對 LIVE2 執行相同操作(確保站點 ID 與 LIVE1 相同)
請注意,站點 ID 確實會影響站點文件的位置,例如日誌文件文件夾會變成
C:\inetpub\logs\LogFiles\W3SVC10
例如。另請注意,您可以通過編輯每台伺服器上 IIS 配置文件中的站點id屬性手動進行這些更改:
C:\Windows\System32\inetsrv\config\applicationHost.config
. 需要管理員權限,之後仍然需要重置。
從您的問題來看,您似乎有一個中央會話狀態伺服器(DB?)來跟踪會話數據?
您還必須同步用於加密任何表單身份驗證等工作的機器密鑰。這也可能會影響會話辨識,我不確定。
此外,您應該使用機器之間的共享配置,它本身可能會解決不同機器密鑰的問題。
編輯:當您更改站點 ID 時,您是否嘗試重新啟動 IIS 管理器以查看 webroot 是否已更改?也許配置與 ID 相關聯,這意味著 ID 的更改也會修改文件根等內容