Helicon Ape mod_proxy module provides simple way to configure load balancer. This article is giving explicit instructions of how to configure and test such load balancer.
Goal
Create simple cluster in which one front-end server (www.site.com), accessible via Internet, proxies some application operation in an intranet (not accessible via Internet).
To improve stability (resistance to failures) and speed the application will run on internal servers (app1.site.com & app2.site.com) which will distribute requests between themselves. In case one server is down (scheduled maintenance, upgrade, breakdown), all requests will be directed to another server.
Requests between the servers are distributed based on the response time value. I.e. the quicker back-end returns responses (better copes with the load), the more requests it will get.
The application uses sessions, so if the request contains the cookie with session id, this request must be assigned to the back-end which initiated this session. The cookie is of the following format [session_data]![backend_id]
.
Static content is also shared between two internal servers (static1.site.com & static2.site.com) so they need to distribute it among themselves as well.
Configuration
Here’s the sample configuration of the balancer described above:
# route all requests starts with /static/ to static balancer
ProxyPass /static/ balancer://static-balancer/
# describe static balancer members
BalancerMember http://static1.site.com/media/
BalancerMember http://static2.site.com/media/
# enable reversing of response redirects
ProxyPassReverse /static/ http://static1.site.com/media/
ProxyPassReverse /static/ http://static2.site.com/media/
# route all other requests to application balancer
ProxyPass / balancer://app-balancer/ stickysession=sessionid routeregex=!(.*)$
# describe application balancer members
BalancerMember http://app1.site.com/ route=app1
BalancerMember http://app2.site.com/ route=app2
# enable reversing of response redirects
ProxyPassReverse / http://app1.site.com/
ProxyPassReverse / http://app1.site.com/
# enable reversing of domain in Set-Cookie headers
ProxyPassReverseCookieDomain app1.site.com www.site.com
ProxyPassReverseCookieDomain app2.site.com www.site.com
What was that?
And here’s the explanation of the code above.
...
section conditions that all directives inside it are applied only to the requests to www.site.com. This is especially important when the server manges several sites.
ProxyPass /static/ balancer://static-balancer/
directive tells mod_proxy that all requests beginning with /static/
must be proxied via static-balancer balancer.
<Proxy balancer://static-balancer/> ...