How to Configure Apache Load Balancing?

This article provides a comprehensive guide on using Apache HTTP Server as a load balancer to distribute traffic across multiple backend servers. You will learn about the essential modules required, how to configure a reverse proxy using mod_proxy_balancer, and how to implement different traffic distribution algorithms like round-robin and weighted load balancing. By the end of this guide, you will be able to set up a resilient and scalable infrastructure that optimizes resource utilization and ensures high availability for your applications.

Prerequisites and Required Apache Modules

Before configuring load balancing, you must ensure that the necessary Apache modules are enabled. Apache relies on a suite of proxy modules to pass requests to backend servers and manage the load-balancing logic.

The core modules you need to enable include:

On Debian or Ubuntu-based systems, you can enable these modules by running the a2enmod command in your terminal:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo systemctl restart apache2

On CentOS or RHEL-based systems, these modules are typically loaded by default in the /etc/httpd/conf.modules.d/00-proxy.conf file. You simply need to ensure they are not commented out before restarting the httpd service.

Configuring the Balancer Member Pool

Once the modules are active, you can define your backend server pool (often called a cluster or balancer member pool) within your Apache configuration file. This is usually handled inside a VirtualHost block in your site configuration file (e.g., /etc/apache2/sites-available/000-default.conf or /etc/httpd/conf.d/welcome.conf).

The <Proxy> directive is used to define the balancer container, and BalancerMember lines specify the IP addresses or hostnames of your backend application servers.

<VirtualHost *:80>
    ServerName www.example.com

    <Proxy "balancer://mycluster">
        BalancerMember http://192.168.1.50:8080
        BalancerMember http://192.168.1.51:8080
    </Proxy>

    ProxyPreserveHost On
    ProxyPass "/" "balancer://mycluster/"
    ProxyPassReverse "/" "balancer://mycluster/"
</VirtualHost>

In this setup, ProxyPass and ProxyPassReverse instruct Apache to intercept all incoming traffic to the root path (/) and forward it to the load balancer pool named mycluster. The ProxyPreserveHost On directive ensures that the original Host: header sent by the client is passed intact to the backend servers, which is crucial for applications that rely on domain-specific routing.

Choosing a Load Balancing Algorithm

Apache supports multiple load-balancing algorithms to determine how traffic is distributed among your backend servers. You can specify the method using the lbmethod parameter inside the Proxy container or on a separate ProxySet line.

Round-Robin (byrequests)

The default algorithm is byrequests, which distributes the incoming requests evenly across all available backend servers in a round-robin fashion.

<Proxy "balancer://mycluster">
    BalancerMember http://192.168.1.50:8080
    BalancerMember http://192.168.1.51:8080
    ProxySet lbmethod=byrequests
</Proxy>

Weighted Load Balancing

If your backend servers do not have equal hardware capabilities, you can assign weights to individual members using the loadfactor parameter. A server with a higher load factor will receive a proportionally higher share of the traffic.

<Proxy "balancer://mycluster">
    BalancerMember http://192.168.1.50:8080 loadfactor=3
    BalancerMember http://192.168.1.51:8080 loadfactor=1
    ProxySet lbmethod=byrequests
</Proxy>

In the configuration above, the first server will handle three times as many requests as the second server, making it ideal if the first server has superior CPU and RAM resources.

Session Stickiness

For applications that store user session data locally on a specific backend server, you must ensure that a user is consistently routed to the same server for the duration of their visit. You can achieve this by enabling sticky sessions using the stickysession parameter, which tracks users via a cookie or a URL parameter.

<Proxy "balancer://mycluster">
    BalancerMember http://192.168.1.50:8080 route=node1
    BalancerMember http://192.168.1.51:8080 route=node2
    ProxySet stickysession=JSESSIONID
</Proxy>

Testing and Verifying the Configuration

After modifying your configuration file, always validate the syntax of your Apache configuration files to ensure there are no typos or errors that could cause downtime.

Run the following command to check your syntax:

sudo apachectl configtest

If the output displays Syntax OK, you can safely restart the Apache service to apply the new load-balancing settings:

sudo systemctl restart apache2

You can verify that the load balancer is working by repeatedly sending requests to your public Apache server using a web browser or a command-line tool like curl. If configured correctly in round-robin mode, you will see the responses alternating between your backend servers, confirming that the traffic is being successfully distributed.