我正在使用 Apache HTTP Server 作为几个 Tomcat 实例的反向代理。我已设置负载平衡,如下所示:
<Proxy "balancer://tomcat-app">
BalancerMember "http://10.0.0.1:8080" hcmethod=HEAD hcuri=/status
BalancerMember "http://10.0.0.2:8080" hcmethod=HEAD hcuri=/status
</Proxy>
ProxyPass "/app" "balancer://tomcat-app"
ProxyPassReverse "/app" "balancer://tomcat-app"
问题在于,由于应用程序需要花费大量时间重新部署,因此每个 tomcat 容器都需要大约 15 分钟才能重新启动。理想情况下,在此期间,负载平衡器会检测到其中一个后端服务器处于离线状态,并暂时将所有传入请求发送到另一个健康的后端服务器。不幸的是,我的文件中还有另一行httpd.conf
:
ProxyTimeout 600
这显然是必要的,因为应用程序可以合理地花费尽可能多的时间来响应某些请求。结果是,负载平衡器无法在 10 分钟内检测到应用程序未“准备就绪”。
问题:有没有办法为健康检查设置与代理请求不同的超时时间?
笔记:欢迎任何关于如何更好地处理这种情况的建议。
答案1
我的问题是不是关于超时:一旦我设置了,健康检查就会开始按预期工作ProxyHCExpr
。
我通过查看后端节点上的状态页面的请求注意到了这一点:只有在我定义了之后,ProxyHCExpr
它们才会每秒或多或少地定期到达。请注意,我不需要使用表达式,添加hcexpr=23
,但是需要设置一个表达式无论如何,mod_proxy_hcheck 才能完成其工作。我原本以为可以安全地省略它,或者apachectl -t
会引发错误或警告。
在里面文档, 它说:
hcexpr
通过 ProxyHCExpr 创建的表达式的名称,用于检查响应标头的健康状况。如果不使用,2xx 到 3xx 状态代码表示成功
基于此,我错假设设置ProxyHCExpr
也是可选的。不幸的是,在我设置它之前,它无法正常工作。我的配置文件来自:
<Proxy "balancer://tomcat">
BalancerMember "http://10.0.0.1:8080" hcmethod=HEAD hcinterval=1 hcpasses=9 hcuri=/app/status
BalancerMember "http://10.0.0.2:8080" hcmethod=HEAD hcinterval=1 hcpasses=9 hcuri=/app/status
</Proxy>
到:
ProxyHCExpr 23 {%{REQUEST_STATUS} =~ /^[23]/}
<Proxy "balancer://ifis-tomcat-col">
BalancerMember "http://10.0.0.1:8080" hcmethod=HEAD hcinterval=1 hcpasses=9 hcuri=/app/status
BalancerMember "http://10.0.0.2:8080" hcmethod=HEAD hcinterval=1 hcpasses=9 hcuri=/app/status
</Proxy>
这是从平衡器管理器看到的配置:
MaxMembers StickySession DisableFailover Timeout FailoverAttempts Method Path Active
2 [2 Used] (None) Off 0 1 bybusyness /app Yes
Worker URL Route RouteRedir Factor Set Status Elected Busy Load To From HC Method HC Interval Passes Fails HC uri HC Expr
http://10.0.0.1:8080 1.00 0 Init Ok 0 0 0 0 0 HEAD 1000ms 9 (0) 1 (0) /app/status
http://10.0.0.2:8080 1.00 0 Init Ok 0 0 0 0 0 HEAD 1000ms 9 (0) 1 (0) /app/status
然后就变成了:
MaxMembers StickySession DisableFailover Timeout FailoverAttempts Method Path Active
2 [2 Used] (None) Off 0 1 bybusyness /app Yes
Worker URL Route RouteRedir Factor Set Status Elected Busy Load To From HC Method HC Interval Passes Fails HC uri HC Expr
http://10.0.0.1:8080 1.00 0 Init Ok 0 0 0 0 0 HEAD 1000ms 9 (0) 1 (0) /app/status
http://10.0.0.2:8080 1.00 0 Init Ok 0 0 0 0 0 HEAD 1000ms 9 (0) 1 (0) /app/status
Health check cond. expressions:
Expr name Expression
23 %{REQUEST_STATUS} =~ /^[23]/