Я использую apache2 mod_proxy
и mod_proxy_balancer
для балансировки нагрузки до 4 отдельных tomcat8 экземпляры на разных серверах. Я использую разные AJP порты для каждого экземпляра tomcat и использование jvmRoute директива в 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 не работает, load blaancer не перенаправляет на этот экземпляр. До этого момента все работает хорошо.
Но проблема в том, что когда я запускаю развертывание на экземплярах tomcat, я останавливаю их один за другим, загружаю новый артефакт и перезапускаю экземпляр. Но балансировщик нагрузки перенаправляет экземпляр tomcat еще до того, как артефакты веб-приложения будут развернуты, инициализированы и подготовлены. Таким образом, пользователь сталкивается с пустым экраном, если он делает запрос на URL-адрес, который еще не готов.
Как я могу справиться с этой ситуацией, чтобы предотвратить перенаправление, пока веб-приложение не будет полностью готово? Как я могу проверить их статус?
Любая помощь очень ценится.
Вероятно, лучший подход - создать своего рода сервлет состояния, который знает, как проверить, полностью ли работает ваш желаемый контекст (война), и использует failonstatus
директива.
Другой вариант - использовать http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html#balancer_manager в вашем развертывании. Шаги: