Apache-2.2
當所有後端伺服器都停止執行 Apache 後面的 HAProxy 時,得到 502 而不是 503
我正在測試將 HAProxy 作為 Apache 2.2 後面的專用負載平衡器執行,以替換我們目前使用 Apache 負載平衡器的配置。在我們目前的僅 Apache 設置中,如果所有後端(源)伺服器都關閉,Apache 將提供 503 服務不可用消息。使用 HAProxy,我得到 502 bad gateway 響應。
我在 Apache 中使用了一個簡單的反向代理重寫規則
RewriteRule ^/(.*) http://127.0.0.1:8000/$1 [last,proxy]
在 HAProxy 中,我有以下內容(以預設 tcp 模式執行)
defaults log global option tcp-smart-accept timeout connect 7s timeout client 60s timeout queue 120s timeout server 60s listen my_server 127.0.0.1:8000 balance leastconn server backend1 127.0.0.1:8001 check observe layer4 maxconn 2 server backend1 127.0.0.1:8001 check observe layer4 maxconn 2
在後端伺服器關閉時測試直接連接到負載均衡器:
[root@dev ~]# wget http://127.0.0.1:8000/ test.html --2012-05-28 11:45:28-- http://127.0.0.1:8000/ Connecting to 127.0.0.1:8000... connected. HTTP request sent, awaiting response... No data received.
所以大概這是因為 HAProxy 接受連接然後關閉它。
我無法讓它在 tcp 模式下工作,但如果你切換到 http 模式,那麼你會得到 503
defaults mode http
在 TCP 模式下,haproxy 不會發出任何狀態程式碼,因此唯一剩下的一點顯然是 apache。我認為這僅僅是因為 haproxy 接受然後關閉使 apache 返回 502 的連接,這是預期的。
所以你觀察到的行為是正確的。無論如何,通常最好在 HTTP 模式下工作。我還建議您啟用“選項 httplog”,它將為您提供非常詳細的日誌,以及“選項 http-server-close”以利用 apache 保持與 haproxy 保持連接的能力,它將顯著減少本地源埠消耗在機器上。