Apache-2.2

當所有後端伺服器都停止執行 Apache 後面的 HAProxy 時,得到 502 而不是 503

  • June 6, 2012

我正在測試將 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 保持連接的能力,它將顯著減少本地源埠消耗在機器上。

引用自:https://serverfault.com/questions/393287