我正在测试在 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