我想使用 HAProxy 對託管在許多相同後端伺服器上的 Apache-PHP 應用程式進行負載平衡和故障轉移。有沒有辦法偵測 HAproxy 上的故障節點,並在單一 HTTP 請求的上下文中將其從活動節點組中刪除,而不傳回 5xx 錯誤。
理想情況下,伺服器可以傳回回應標頭 -“狀態:錯誤”,並且 HAProxy 應該會偵測此標頭並從活動集中刪除該特定節點。
我無法從我的應用程式返回 5xx 錯誤。
HAProxy 可以這樣設定嗎?
答案1
5xx 回應仍然是回應,因此預設情況下它將傳遞到客戶端。
我還沒有看到任何產品能夠達到您提到的開箱即用的水平。如果不存在,您需要一個負載平衡器,該負載平衡器可讓您編寫自訂後回應規則,並且該規則有權修改池中壞節點的狀態並將請求回饋回池中。F5 BigIP 的,河床魟魚 (Zues)當然提供腳本元素和節點管理(f5 例如向下)。漆和烏賊儘管不是純粹的負載平衡器也提供了修改後端響應後響應的能力。但我不確定他們對節點/池管理的存取權限。請注意,您還需要以與 5xx 回應相同的方式處理請求逾時。
用於監視節點狀態的頁面還需要能夠徹底測試應用程式狀態並且可以非常頻繁地訪問
最接近的 HAProxy 看起來是observe <mode>
這使得它能夠對常規流量中發生的錯誤做出反應。
我無法從我的應用程式返回 5xx 錯誤。
在某些時候它會發生,迎合它。
答案2
我同意 MindtheMonkey 的大部分評論。請注意,您也可以阻止回應並將其替換為自訂內容(使用 502 錯誤),但這有一點限制(例如:它可以用於發送重定向以使瀏覽器再次發布請求)並且很髒。
你首先為什麼要這樣做?說你「無法回傳 5xx」是錯誤的,因為無論如何你都會這樣做,而且客戶也必須根據定義和規範來處理這個問題。這是因為您所在的 CDN 在返回 5xx 時行為不當嗎?如果是這樣,也許您只想重寫輸出錯誤代碼(但要非常小心您使用的程式碼,它們都有非常具體的語義)。
答案3
Praveen,如果您至少使用 PHP 5.4,這應該對您的 PHP 應用程式有所幫助:
如果您使用的是 PGP 4.3 到 5.3,則可以使用 header() 來代替(請參閱手冊頁以了解用法)。
從技術上講,您可以設定 HAProxy 來執行您要求的操作,但簡單地修改您的應用程式以使其正常運行可能更合適。那時,HA 代理應該或多或少自動處理它。