我在用阿帕奇2 mod_proxy
并将mod_proxy_balancer
负载平衡到 4 个独立的tomcat8不同服务器上的实例。我使用不同的急性日照每个 tomcat 实例的端口并使用虚拟机路由tomcat 中的指令server.xml
,如下所示:第一个实例:
<Connector port="[port1]" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
第二审:
<Connector port="[port2]" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
等等。
在 apache2 配置中,我定义了一个集群,如下所示:
<Proxy balancer://myCluster>
BalancerMember ajp://[ip1]:[port1] route=tomcat1 loadfactor=1
BalancerMember ajp://[ip2]:[port2] route=tomcat2 loadfactor=1
BalancerMember ajp://[ip3]:[port3] route=tomcat3 loadfactor=1
BalancerMember ajp://[ip4]:[port4] route=tomcat4 loadfactor=1
ProxySet lbmethod=bybusyness
ProxySet stickysession=JSESSIONID
Order Deny,Allow
Deny from none
Allow from all
</Proxy>
以及 proxypass 指令:
ProxyPass / balancer://myCluster/
ProxyPassReverse / balancer://myCluster/
...
它按预期运行,按预期进行负载平衡,并且如果 Tomcat 实例关闭,负载平衡器不会重定向到该实例。到目前为止,一切都运行良好。
但问题是,当我在 tomcat 实例上触发部署时,我会逐个停止它们,上传新的工件并重新启动实例。但是,负载平衡器甚至在 Web 应用程序工件部署、初始化和准备就绪之前就重定向了 tomcat 实例。因此,如果用户向尚未准备好的 URL 发出请求,他将面临空白屏幕。
在 Web 应用程序完全准备就绪之前,我该如何处理这种情况以防止重定向?我如何检查它们的状态?
任何帮助深表感谢。
答案1
可能最好的方法是构建一种状态 servlet,它知道如何检查您所需的上下文(战争)是否完全可操作并利用failonstatus
指令。
另一个选择是使用http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html#balancer_manager在您的部署中。步骤如下:
- 禁用工人
- 部署
- 等待启动/检查
- 启用工作者