Simple load balancing with Apache proxy_balancer
Load balancing with Apache proxy_balancer concept
For a proof-of-concept to increase the availability of a web server, I am experimenting with Apache Proxy Load Balancing. The concept is kept simple, with four virtual machines in total. One virtual machine is acting as Load Balancer (Frontend) and three other virtual machines are acting as Backend web servers. To test the load balancing and availability, I’m using a laptop running Kali Linux, which provides the tools for Testing.
To generate the proper load, I’m using Siege, which is a HTTP load testing and benchmarking tool.
The concept looks like this as shown in the simple drawing below:

Virtual setup for Apache Proxy Load Balancer concept
On my virtual environment (running on XCP-NG), I’m distributing two virtual machines (balancer + www1) on the first node, and two virtual machines (www2 + www3) on the second node. The virtual machines use a Debian GNU/Linux standard setup with Apache web servers.

On the virtual machine with the Apache Load Balancer, I am using the following, simple configuration. With a2endmod I make sure the modules proxy, proxy_http, proxy_balancer and lbmethod_byrequests are enabled. In addition, I set up a status page called balancer-member to view the status and function of the load balancing.
# Disable Server Signatures for Production environments
ServerTokens Prod
ServerSignature Off
<VirtualHost *:80>
<Proxy balancer://cluster>
# Set Proxy balancing method
ProxySet lbmethod=byrequests
# Set Balancer members
BalancerMember http://192.168.0.31:80
BalancerMember http://192.168.0.32:80
BalancerMember http://192.168.0.33:80
</proxy>
# Use incoming Host HTTP request header for proxy request
ProxyPreserveHost On
# Add proxy information in X-Forwaders headers
ProxyAddHeaders On
# Proxy except for Status page, then everything else
ProxyPass /balancer-manager !
ProxyPass / balancer://cluster/
ProxyPassReverse / balancer://cluster/
# Status URL location
<Location /balancer-manager>
SetHandler balancer-manager
</Location>
# Set Server name and admin to something with example.com
ServerName balancer.example.com
ServerAdmin webmaster@balancer.example.com
# Standard log settings
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Testing the load balancing with siege
For testing I’m using the Kali Linux laptop and perform a load and stress test with the following command:
siege http://192.168.0.30 -t 1H -c 255
The screenshot below shows the status of balancer-manager, where all three Backend web servers received traffic and where www2 simulates a failure by shutting down the Apache web server.

Note: Added ProxyPassReverse Directive which is required for redirect responses.