我有一个 haproxy 服务器,其后有多个后端。后端采用循环方式选择;无论如何,如果它从所选的后端获得 404,我需要它尝试其他后端。
如果所有可访问的后端都返回 404,则 haproxy 应该向客户端返回 404。
那可能吗?
答案1
不,目前还不可能。
如果在发送请求之前出现错误(例如连接超时),HAProxy 会重试另一个后端服务器。如果与一个后端服务器建立了连接并发送了请求,即使只有一个字节,HAProxy 也不会尝试使用另一个后端服务器。
答案2
否。
option redispatch
这是 HAProxy 最接近的功能,但只有在大于 0 且与后端的连接失败时,它才会重试不同的后端retries
。它不关心来自后端的 HTTP 状态代码,它只关心后端是否关闭(无法访问,无响应)
答案3
是的,如果我理解正确的话,可以选择
option httpchk GET /../CheckHealth.html
http-check disable-on-404
其中 CheckHealth.html 应该是一个可达资源示例,如果未找到资源并且收到 404 错误,则该节点已设置为“活动或备份 SOFT STOPPED 进行维护”,并且循环永远不会再向该节点发送请求,仅切换到其他节点。
就像是 :
backend backend_servers
balance roundrobin
option httpchk GET /.../CheckHealth.html
http-check disable-on-404
server www01 XX:YY:ZZ:KK:8180 check
server www02 XX:YY:ZZ:MM:8180 check
server www03 XX:YY:ZZ:FF:8180 check
将会在 www02 上失败,因为那里没有部署 WAR,而 www01 和 www03 上则保持平衡,客户端不会看到任何故障。