Load Balancing with HAProxy

Load Balancing with HAProxy

HAProxy is great solution for load balancing as it does not require lots of resources, it is scalable, easy to setup and fairly simple to manage. In this guide I'll show you how to install and configure HAProxy and load balance 2 Apache Web Servers.
The distro of my choice is CentOS 7 but you can use any distro you like.


1. What is HAProxy

HAProxy is free, open source software that provides a high availability load balancer and proxy server for TCP and HTTP-based applications that spreads requests across multiple servers. For more information take a look at their official website: http://www.haproxy.org/

2. Installation

Thanks to its popularity HAProxy is available in the default CentOS repos. For the sake of simplicity I will use the version available in the default repo, though you need to keep in mind that this might not be the latest release of HAProxy.

In this case all you need to run is:

yum -y install haproxy

After that you can start the service and enable it:

systemctl start haproxy
systemctl enable haproxy

If you are planning to build a proper load balanced solution, I would recommend installing HAProxy on a separate box.

3. Configuration

You can find the HAProxy config file at: /etc/haproxy/haproxy.cfg
To keep things simple I would only use the following standard rules:

frontend http_front
   bind *:80
   stats uri /haproxy?stats
   acl url_admin path_beg /admin
   use_backend admin_back if url_admin
   default_backend http_back

backend http_back
   balance roundrobin
   server  :80 check
   server  :80 check

backend admin_back
   server  :80 check

In my case, thanks to the ACL rule named url_admin, all connections that match the /admin rule would be forwarded to the admin_back backend. That way I would make sure that all /admin connections would be forward to my admin server. You can of course adjust that.

HAProxy is very flexible so you could add lots of rules and different backend servers depending on your setup and requirements.

After making the configurations, save the file and restart HAProxy with the next command.

systemctl restart haproxy

The restart is super quick and should not cause any major downtime.


4. Demo

To make things more clear, here's an example of how the above would work:

- HAProxy server would be: bobby.haproxy
- Server 1 would be called: bobby.server1
- Server 2 would be called: bobby.server2

Here's what happens when you make 10 http requests to the HAProxy server:

HAProxy Demo

You can see that the connections are being load balanced between the two webservers.

Thanks to the ACL url_admin rule that we have, here's what happens when I make 10 http connections to my /admin page:

HAProxy Demo Admin

5. Statistics Report

HAProxy comes with very handy builtin Statistics Report, you will be able to see the status of your backend servers, their uptime, the number of handled connections and more.

You just need to visit the status URL specified in your config, in my case I've set that to: /haproxy?stats

You would see a similar page:

Haproxy Statistics Report


This is pretty much all that I wanted to cover here.

I would not get into the different types of load balancing and etc. but I might cover those in future articles.

For the moment I would suggest checking out this awesome book here:

As always, hope that this helps :)