What is HAProxy?
HAProxy or High Availability proxy is a Free and open source application that can help with load balancing of web servers and for proxy Solutions. It helps to improve the overall performance and reliability of the server environment. In this article, I will tell you how to setup HAProxy HTTP load balancer on CentOS server.
Before we talk about HAProxy, let’s first talk about the concept of load balancing.
No Load Balancing
This is the simple server environment. It doesn’t provide any load balancing or redundancy. A server which is setup in this kind of environment can handle hundreds or thousands of requests without any issues. However, when it receives a high number of concurrent requests, it will not be able to serve all of them, no matter how powerful it is. This is where load balancing and HAProxy comes in to play. Take a look at the image given below.
Load Balancing with HAProxy
So, HAProxy distributes the workload across multiple servers in the most efficient manner, and thereby improves the overall performance and reliability of the server environment. The main advantage of this type of setup is, it can serve high traffics easily.
How To Setup HAProxy HTTP Load Balancer on CentOS
The latest stable version of HAProxy is 1.8.x. However, the version which comes with the default CentOS repository is 1.5.18. So, we will install the latest HAProxy 1.8.x from source.
[[email protected] ~]# yum info haproxy | grep Version Version : 1.5.18 [[email protected] ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [[email protected] ~]#
Before we begin, we need to install the software/tools for downloading and compiling HAProxy. The following command will do this.
yum install wget gcc pcre-static pcre-devel -y
The next step is to download the source code.
[[email protected] ~]# cd /usr/local/src/ [[email protected] src]# wget http://www.haproxy.org/download/1.8/src/haproxy-1.8.13.tar.gz
Extract the downloaded TAR.GZ file and change into the extracted directory.
[[email protected] src]# tar -zxf haproxy-1.8.13.tar.gz [[email protected] src]# cd haproxy-1.8.13
Now, compile and install HAProxy on your server.
Read the Makefile and README file on this directory before proceeding with the installation process.
-rw-rw-r--. 1 root root 36682 Jul 30 15:32 Makefile -rw-rw-r--. 1 root root 15356 Jul 30 15:32 README
As per the Makefile, you should compile HAProxy as mentioned below:
# [g]make TARGET=os ARCH=arch CPU=cpu USE_xxx=1 ...
So, we will compile the source code using the following command:
[[email protected] haproxy-1.8.13]# make TARGET=generic ARCH=native CPU=x86_64 -j8
Now, install HAProxy using “make install”.
[[email protected] haproxy-1.8.13]# make install
[[email protected] haproxy-1.8.13]# make install install -d "/usr/local/sbin" install haproxy "/usr/local/sbin" install -d "/usr/local/share/man"/man1 install -m 644 doc/haproxy.1 "/usr/local/share/man"/man1 install -d "/usr/local/doc/haproxy" for x in configuration management architecture peers-v2.0 cookie-options lua WURFL-device-detection proxy-protocol linux-s yn-cookies network-namespaces DeviceAtlas-device-detection 51Degrees-device-detection netscaler-client-ip-insertion-protoc ol peers close-options SPOE intro; do \ install -m 644 doc/$x.txt "/usr/local/doc/haproxy" ; \ done
Next, copy the init.d script from “haproxy-1.8.13/examples/haproxy.init” directory to “/etc/init.d/” and set proper permissions.
[[email protected] haproxy-1.8.13]# cp examples/haproxy.init /etc/init.d/haproxy [[email protected] haproxy-1.8.13]# chmod 755 /etc/init.d/haproxy [[email protected] haproxy-1.8.13]# systemctl daemon-reload
We also need to create some additional directories and a stats file.
[[email protected] haproxy-1.8.13]# mkdir -p /etc/haproxy [[email protected] haproxy-1.8.13]# mkdir -p /run/haproxy [[email protected] haproxy-1.8.13]# mkdir -p /var/lib/haproxy [[email protected] haproxy-1.8.13]# touch /var/lib/haproxy/stats
Create a Symbolic link for “/usr/local/sbin/haproxy” to “/usr/sbin/haproxy”.
[[email protected] haproxy-1.8.13]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
Create a new system user haproxy
[[email protected] haproxy-1.8.13]# useradd -r haproxy
Configure HAProxy Load Balancer
We need to mention what kind of connections HAProxy should be listening for and which servers it should relay the connections to on the main HAProxy configuration file.
Create a new file “/etc/haproxy/haproxy.cfg” with the following contents:
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy user haproxy group haproxy daemon # turn on stats unix socket stats socket /run/haproxy/admin.sock mode 660 level admin defaults mode http log global option httplog option dontlognull timeout queue 1m timeout connect 5000 timeout client 50000 timeout server 50000 timeout http-keep-alive 10s timeout check 10s frontend http_front bind *:80 stats uri /haproxy?stats default_backend http_back stats auth admin:haproxy #user/password for stats page backend http_back balance roundrobin server hostname-1 private-ip-1:80 check # backend server server hostname-2 private-ip-2:80 check # backend server
This configuration file uses roundrobin algorithm to serve traffic among your backend servers. Replace the hostname-1 and hostname-2 parameters with the hostnames of your backend servers. Also, replace the private-ip-1 and private-ip-2 with the private IP address of your backend servers.
Save the configuration file and restart HAProxy.
[[email protected] ~]# systemctl restart haproxy [[email protected] ~]# chkconfig haproxy on [[email protected] ~]# chkconfig --list haproxy
The other commonly used algorithms are as follows:
In this type, the connection will be forwarded to the server with the least number of connections. Round-robin is performed within groups of servers of the same load to ensure that all servers will be used. Use of this algorithm is recommended where very long sessions are expected, such as LDAP, SQL, TSE, etc.
Source IP Address Based
This selects which server to use based on the clients IP Address. This method ensures that a user will connect to the same server as long as no server goes down or up.
I will explain about the different HAProxy load balancing algorithms with examples on another post.
Configure Backend Servers
Install Apache on your backend servers using the following command.
yum install httpd # CentOS/RedHat apt-get install apache2 # Ubuntu/Debian
Now, create an “index.html” file in the default document root of your backend servers. For testing purpose, setup the backend servers with a slightly different landing pages (index.html) so that you can notice that each time you reload the page, you will get a reply from different hosts.
Now, you can access the Load Balancer Public IP Address to load the test index.html files.
http://<load balancer public IP>/
You can monitor HAProxy from the stats page using the following URL:
http://<load balancer public IP>/haproxy?stats
The username is admin and the password is haproxy for viewing the HAProxy statistics page. If you want, you can change the login details for stats page HAProxy configuration file.
If all of the servers are listed in green on the stats page, it means your configuration is proper. The statistics page will have useful information to help keep track of the web hosts including uptime, downtime, and session counts.
That’s it. We are done with HAProxy setup. For any additional help, please refer the official HAProxy documentation here. If you have any questions, feel free to post it in the comment section.