Я пытаюсь настроить балансировщик нагрузки с Apache mod_proxy и Tomcat. У меня есть следующие модули (mod_proxy, mod_proxy_balancer, mod_proxy_http). У меня есть 2 экземпляра Tomcat, и я планирую направить запрос на один из серверов Tomcat.
Мое приложение на Tomcat работает нормально при прямом доступе. www.mydomain: 8080 / myapp www.mydomain: 9080 / myapp
Мой Tomcat server.xml имеет следующий Tomcat 1 Engine name = "Catalina" defaultHost = "localhost" jvmRoute = "tomcat1"
Имя ядра Tomcat 2 = "Catalina" defaultHost = "localhost" jvmRoute = "tomcat2"
Вот что у меня в virtualhost.conf
<IfModule proxy_module>
ProxyRequests on
ProxyPreserveHost Off
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID
ProxyPassReverse / balancer://mycluster/ stickysession=JSESSIONID
ProxyPassReverseCookiePath /myapp /
<Proxy balancer://mycluster >
BalancerMember http://localhost:8080/myapp route=tomcat1
BalancerMember http://localhost:9080/myapp route=tomcat2
Require all granted
ProxySet lbmethod=byrequests
</Proxy>
<Location /balancer>
SetHandler balancer
Require host www.mydomain.com
</Location>
</IfModule>
С приведенной выше конфигурацией я могу получить доступ к первой странице сайта. Когда я захожу на www.mydomain.com, он загружает страницу входа (www.mydomain.com/login.do). Когда я нажимаю на другие ссылки, он открывает правильные страницы. Например: www.mydomain.com/password-reset.do Базовая отработка отказа также работает. Если я отключу один экземпляр Tomcat, он будет обслуживать страницу с другого сервера и наоборот.
Но когда я пытаюсь отправить любой запрос POST, например, попытаться войти в систему, URL-адрес меняется на www.mydomain / myapp / login.do и всегда показывает страницу входа.
Я не уверен, что приведенные выше записи conf полностью соответствуют тому, что я хочу. Может ли кто-нибудь указать мне, что не так. Также, пожалуйста, дайте мне знать, если мне здесь что-то не хватает в отношении успеха. Я также хотел бы, чтобы файлы изображений и другие файлы обслуживались непосредственно с веб-сервера. Пожалуйста, дайте мне знать, как я могу это сделать.
Спасибо
Обычно это происходит в двух случаях. Это не требует балансировщика - это все равно происходит с одним бэкендом.
Место в HTML-коде приложения может содержать буквальный абсолютный URL-адрес, например http://example.com/myapp/post_here поэтому POST отправляется туда (что на самом деле попадает в бэкэнд с http://127.0.0.1:xxxx/myapp/myapp/post_here). Для этого существует широкий спектр решений.
Другая возможность. POST обычно приводит к перенаправлению (302). Бэкэнд может перенаправить на абсолютный URL http://example.com/myapp/post_here которые бы не поймали. Ваш ProxyPassReverse в настоящее время ловит только http://127.0.0.1:xxxx/myapp/post_here. Можете добавить ProxyPassReverse / http://example.com/myapp
ниже вашего как дополнительный, это разрешено.
Оба случая легко заметить, если вы настроите свой браузер на регистрацию сетевых запросов / ответов (опция разработчика как в Firefox, так и в Chrome).