I am trying to setup a Load balancer with Apache mod_proxy and Tomcat.
I have the following modules available (mod_proxy, mod_proxy_balancer, mod_proxy_http)
I have 2 Tomcat instances and the plan is to route the request to one of the Tomcat server.
My application on Tomcat is running fine when I directly access.
www.mydomain:8080/myapp
www.mydomain:9080/myapp
My Tomcat server.xml has the following
Tomcat 1
Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"
Tomcat 2
Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2"
Here is what I have in my 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>
With the above configuration I am able to access the site first page. When I access www.mydomain.com, it loads the login page(www.mydomain.com/login.do)
When I click on other links it's opening the correct pages. For eg: www.mydomain.com/password-reset.do
The basic fail over also works. If I shutdown one Tomcat Instances, it serves the page from the other server and vice versa.
But when I try to submit any POST requst like try to Login, the url change to www.mydomain/myapp/login.do and always shows the login page.
I am not sure the above conf entries are fully correct with respect to what I want.
Can some one points me what is wrong. Also please let me know if I am lacking anything here with respect to sucurity.
I also would like to have image files and other files served directly from the Webserver. Please let me know how I can do that.
Thanks
Best Answer
There are two cases when this usually happens. It doesn't involve balancer - it happens all the same with a single backend.
A place in the HTML of application could contain a literal absolute URL like http://example.com/myapp/post_here so POST goes there (which in fact hits backend with http://127.0.0.1:xxxx/myapp/myapp/post_here). There is a broad range of solutions to this.
Another possibility. The POST usually results in a redirect (302). The backend might redirect to an absolute URL http://example.com/myapp/post_here which wouldn't be catched. Your ProxyPassReverse presently only catches http://127.0.0.1:xxxx/myapp/post_here. You can add
ProxyPassReverse / http://example.com/myapp
below yours as an additional one, it's allowed.Both cases are simple to observe if you set your browser to log network requests/responses (developer option in both Firefox and Chrome).