2012-01-18 115 views
0

假設我有一個PHP/Python(Django)網站。 該網站正在多個實例服務器上運行。 含義該網站的網址是www.test.com,並從負載平衡器,它可以得到客戶端www.server1.com或www.server2.com等。多個實例(服務器)上的網站表單(POST)網站(Python Django/PHP)

當網站上有表格,並且此表格的處理位於同一頁面上時: 可以存在以下情況嗎? : - 用戶訪問www.test.com - 在幕後,通過負載均衡器,他可以訪問www.server * * .com。他填寫表格。 - 表單動作(URL)用於www.test.com - 所以在幕後,通過負載均衡器,他可以訪問www.server * * .com。 所以在這裏,將需要的表單數據,更重要的是我的問題 - 「請求」數據(如Python Django中的request.SOMETHING)將會丟失?因爲它可能在會議前被保存在www.server * * .com,現在它在www.server * * .com中缺失。

回答

0

該請求將始終包含所有數據,因爲該數據會被轉發到邊緣服務器。 request.POSTrequest.GET將具有來自請求的所有數據。但是,問題是會話數據可能無法在該邊緣服務器上使用。例如,您在server1上開始會話,然後從server2請求另一個頁面。 server2可能會分配一個新的會話並禁止您訪問某些內容。

爲了克服這個問題的會議,你可以做兩件事情之一:服務器之間

  1. 共享會話(中央會話存儲)
  2. 永遠向前的用戶在同一邊緣服務器。一些負載均衡器將這個forwared-to-edge服務器存儲在一個cookie中。在隨後的請求中,用戶每次都會被轉發到同一個邊緣節點。相同的邊緣節點將保持該用戶的會話,所以沒有問題。
+0

但是,如果您想要進行故障切換,則選項2本身是不夠的(沒有選項1)。假設您將會話保存在第一臺服務器上,並且在下一次請求時服務器不可用。你已經失去了客戶的狀態。 – 2012-01-18 11:47:48

+0

@UkuLoskit我不明白如果沒有失敗的負載平衡器,網站將如何工作。但是,提供故障安全將是一個好主意。 – bouke 2012-01-18 11:50:54

+0

對不起,我的意思是服務器,而不是負載平衡器。 – 2012-01-18 11:51:55

0

是的,這是一個值得關注的問題。由於Web(HTTP)的性質,其他請求可能會在另一臺服務器上結束。這個問題被稱爲持久性或粘性。

這裏的解決方案是將所有這些信息保存在客戶端(使用cookie)而不依賴於服務器端會話。所以這將取決於你如何使用Python/Django來實現它。使用客戶端方法提供最佳性能,並且應該是最容易實現的。

請記住,除非使用SSL/TSL(使用HTTPS)加密連接,否則此解決方案對中間人攻擊具有相當嚴重的安全風險,因爲所有客戶端數據均存儲在可能被攔截的餅乾。