我想使用HAProxy来负载平衡和故障转移许多相同的后端服务器上托pipe的Apache-PHP应用程序。 是否有任何方法检测HAproxy上的失败节点,并在单个HTTP请求的上下文中将其从活动的一组节点中删除,而不返回5xx错误。
理想情况下,服务器可以返回一个响应头 – “状态:错误”,HAProxy应该检测到这个头,并从活动集中移除该特定节点。
我不能从我的应用程序返回5xx错误。
HAProxy是否可以这样configuration?
5xx响应仍然是一个响应,所以默认情况下它将被传递到客户端。
我还没有看到一个产品达到你提到的水平。 如果不存在,则需要使用负载平衡器来编写自定义post响应规则,并使该规则有权修改池中错误节点的状态,并将请求反馈回池中。 F5 BigIP的 Riverbed StingRay(Zues)当然提供了脚本元素和节点pipe理( 例如f5 )。 Varnish和Squid虽然不是纯粹的负载平衡器,但它提供了在后端响应后修改响应的能力。 我不确定他们是否可以访问节点/池pipe理。 请注意,您还需要以与5xx响应相同的方式处理请求超时。
用于监视节点状态的页面也需要彻底testing应用程序状态,并且可能会频繁地被点击
最接近的HAProxy看起来是这样的observe <mode>
,它允许它对正常stream量中发生的错误做出反应。
我不能从我的应用程序返回5xx错误。
在某种程度上它会发生,迎合它。
我同意mindthemonkey的大部分意见。 请注意,您也可以阻止响应,并将其replace为自定义内容(使用502错误),但这有点有限(例如:可用于发送redirect以使浏览器再次发送请求)和挺脏的。
为什么你想这样做呢? 说你“不能返回5xx”是错误的,因为无论如何,客户也必须按照定义和规范来处理这个问题。 这是因为你在返回5xx时背后是一个CDN吗? 如果是这样,也许你只是想重写输出错误代码(但要非常小心你使用的代码,他们都有非常具体的语义)。
Praveen,如果你至less使用PHP 5.4这应该有助于你的PHP应用程序:
如果您使用PGP 4.3到5.3,则可以使用header()(请检查手册页的使用情况)。
从技术上讲,你可以configurationHAProxy来完成你所要求的操作,但是简单地修改你的应用程序来正确运行可能更合适。 此时,HA代理应该自动处理它。