Apache httpd 工作者重试

Apache httpd 工作者重试

我有一个运行 mod_proxy 和 mod_proxy_balancer 的 Apache httpd Web 服务器。整个 /somedir 被发送到 2 台工作机器,它们使用循环调度程序为请求提供服务。每台工作机器都在运行 IIS,但我认为这并不重要。

我可以通过重复请求包含机器 IP 地址的单个页面来演示负载平衡器的工作原理,并且可以看到它以可预测的循环方式从一个页面切换到另一个页面。

如果我关闭其中一个 IIS 服务器并开始请求同一页面,则每个页面仅包含正在运行的计算机的 IP 地址。但是,如果我启动 IIS 但不运行我的 IIS 应用程序,则 /somedir 将返回 500(正如它应该的那样)。

我已将 500 添加到 failonstatus(Apache 2.4),因此当它遇到错误时,Apache 会将工作机器置于错误状态。但是 Apache 仍然会将代理错误返回给客户端。我怎样才能让 Apache 捕获代理故障并使用不同的工作程序重试,就像连接故障一样。

更新

StackOverflow 中提出了几乎相同的问题,因此将它们合并在一起。

https://stackoverflow.com/questions/11083707/httpd-mod-proxy-balancer-failover-failonstatus-transperant-switching

答案1

我曾与 httpd 邮件列表上的一名开发人员交流过,他确认此功能尚未在当前代码库中实现。我自己也审查了代码。mod_proxy_balancer 中的状态机无法在 HTTP 错误时重试,但只能在连接错误的情况下重试。我尝试自己实现它,但它太复杂了,很容易使代码库变得不稳定。

所以这个问题目前还没有已知的解决方案......

答案2

以防万一有人再次遇到这个问题:该failonstatus指令自 Apache 2.2.27 起实施。

<Proxy balancer://backends>
BalancerMember http://10.1.1.11
BalancerMember http://10.1.1.12
ProxySet failonstatus=500
</Proxy>

日志:

[Thu Apr 28 03:13:06.176916 2016] [proxy_balancer:error] [pid 3285:tid 140231873353472] [client 10.1.1.1:43608] AH01174: balancer://puppetmaster: Forcing worker (http://10.1.1.12) into error state due to status code 500 matching 'failonstatus' balancer parameter

相关内容