当所有后端服务器都关闭并在 Apache 后面运行 HAProxy 时,获取 502 而不是 503

当所有后端服务器都关闭并在 Apache 后面运行 HAProxy 时,获取 502 而不是 503

我正在测试在 Apache 2.2 后面运行 HAProxy 作为专用负载均衡器,以替换我们使用 Apache 负载均衡器的当前配置。在我们当前的 Apache 设置中,如果所有后端(源)服务器都关闭,Apache 将发出 503 服务不可用消息。使用 HAProxy 时,我收到 502 错误网关响应。

我在 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 接受了连接然后又关闭了它。

答案1

在 TCP 模式下,haproxy 不会发出任何状态代码,因此唯一剩下的点显然是 apache。我认为这只是因为 haproxy 接受然后关闭连接,导致 apache 返回 502,这是预期的。

因此,您观察到的行为是正确的。无论如何,在 HTTP 模式下工作通常更好。我还建议您启用“option httplog”,它将为您提供非常详细的日志,以及“option http-server-close”,以利用 apache 与 haproxy 保持保持活动的能力,这将大大减少机器上的本地源端口消耗。

答案2

我无法让它在 tcp 模式下工作,但如果你切换到 http 模式,那么你就会得到 503

defaults
    mode http

相关内容