HAProxy - HTTP 服务器错误检测

HAProxy - HTTP 服务器错误检测

我想使用 HAProxy 对托管在许多相同后端服务器上的 Apache-PHP 应用程序进行负载平衡和故障转移。有没有办法在单个 HTTP 请求的上下文中检测 HAproxy 上的故障节点并将其从活动节点组中删除,而不会返回 5xx 错误。

理想情况下,服务器可以返回响应标头 - “状态:错误”,并且 HAProxy 应该检测此标头并从活动集中删除该特定节点。

我无法从我的应用程序返回 5xx 错误。

HAProxy 可以进行这样的配置吗?

答案1

5xx 响应仍然是响应,因此默认情况下它会被传递到客户端。

我还没有看到一款产品可以达到您提到的开箱即用水平。如果不存在,您需要一个负载平衡器,它允许您编写自定义帖子响应规则,并且该规则有权修改池中坏节点的状态并将请求反馈回您的池。F5 BigIP河床黄貂鱼 (Zues)当然提供脚本元素和节点管理(f5 例如向下)。乌贼虽然并非纯粹的负载均衡器也提供修改后端响应后响应的功能。但我不确定它们是否能够访问节点/池管理。请注意,您还需要以与 5xx 响应相同的方式处理请求超时。

用于监控节点状态的页面也需要能够全面测试应用程序的状态,并且可以频繁访问

HAProxy 最接近这种情况的是observe <mode>这使得它能够对常规流量中发生的错误做出反应。

我无法从我的应用程序返回 5xx 错误。

某个时候它会发生,我们要适应它。

答案2

我同意 mindthemonkey 的大部分评论。请注意,您还可以阻止响应并将其替换为自定义内容(使用 502 错误),但这有点受限(例如:它可用于发送重定向以使浏览器再次发布请求)并且相当肮脏。

你为什么要这样做?说你“不能返回 5xx”是错误的,因为你无论如何都会返回 5xx,而且根据定义和规范,客户端也必须处理这个问题。这是因为你使用的是 CDN,而 CDN 在返回 5xx 时行为不当吗?如果是这样,也许你只想重写输出错误代码(但要非常小心你使用的代码,它们都有非常具体的语义)。

答案3

Praveen,如果你至少使用 PHP 5.4,这应该会对你的 PHP 应用程序有所帮​​助:

如果您使用的是 PGP 4.3 到 5.3,则可以改用 header()(查看手册页了解用法)。

从技术上讲,您可以配置 HAProxy 来执行您的要求,但更合适的做法可能是简单地修改您的应用程序以使其正常运行。此时,HA Proxy 应该或多或少会自动处理它。

相关内容