Sat, March 24, 2018 ยท 3 min read

Haproxy basic setup on centos7

Haproxy basic setup on centos7

I am using vagrant with libvirt provider to setup a round robin setup of haproxy, a haproxy centos7 vm and two webservers running centos7.

Clone my git from https://github.com/pawaanv/cipher-setup/

$ git clone https://github.com/pawaanv/cipher-setup/
Cloning into 'cipher-setup'...
remote: Counting objects: 89, done.
remote: Compressing objects: 100% (69/69), done.
remote: Total 89 (delta 36), reused 65 (delta 15), pack-reused 0
Unpacking objects: 100% (89/89), done.
Checking connectivity... done.

Make a directory called haproxy and copy files bootstrap.sh, Vagrantfile, haproxy.sh to it.

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: "ifup eth1", run: "always"
config.vm.define :ha do |ha|
ha.vm.box = "centos/7"
ha.vm.box_check_update = false
ha.vm.network "forwarded_port", guest: 80, host: 8080
ha.vm.network "private_network", ip: "192.168.121.200"
ha.vm.hostname = "ha.vagrant.box"
ha.vm.provision :shell, path: "haproxy.sh"
config.vm.provider :libvirt do |libvirt|
    libvirt.uri = "qemu:///system"
    libvirt.connect_via_ssh = false
    libvirt.username = "root"
    libvirt.storage_pool_name = "default"
    libvirt.memory = "420"
    libvirt.driver = "kvm"
end
end

config.vm.define :one do |one|
one.vm.box = "centos/7"
one.vm.box_check_update = false
one.vm.network "forwarded_port", guest: 80, host: 8081
one.vm.network "private_network", ip: "192.168.121.201"
one.vm.hostname = "one.vagrant.box"
one.vm.provision :shell, path: "bootstrap.sh"
config.vm.provider :libvirt do |libvirt|
    libvirt.uri = "qemu:///system"
    libvirt.connect_via_ssh = false
    libvirt.username = "root"
    libvirt.storage_pool_name = "default"
    libvirt.memory = "420"
    libvirt.driver = "kvm"
end
end

config.vm.define :two do |two|
two.vm.box = "centos/7"
two.vm.box_check_update = false
two.vm.network "forwarded_port", guest: 80, host: 8082
two.vm.network "private_network", ip: "192.168.121.202"
two.vm.hostname = "two.vagrant.box"
two.vm.provision :shell, path: "bootstrap.sh"
config.vm.provider :libvirt do |libvirt|
    libvirt.uri = "qemu:///system"
    libvirt.connect_via_ssh = false
    libvirt.username = "root"
    libvirt.storage_pool_name = "default"
    libvirt.memory = "420"
    libvirt.driver = "kvm"
end
end
end

bootstrap.sh (for httpd)

#!/bin/bash
echo "setting apache server on vm's"
sleep 3
yum install httpd -y
systemctl start httpd
systemctl enable httpd
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
echo "$HOSTNAME" >> /var/www/html/index.html

haproxy.sh (postinstall script)

#!/bin/bash
if [ ! -e /etc/haproxy/haproxy.cfg ]
then
echo "installing ha proxy"
sleep 5
yum -y install haproxy
systemctl start haproxy
systemctl enable haproxy
cp /etc/haproxy/haproxy.cfg{,-bkp}
cat > /etc/haproxy/haproxy.cfg <<EOD
global
    log 127.0.0.1   local0
    log 127.0.0.1   local1 debug
    maxconn   45000
    daemon
    nbproc      1
defaults
    timeout server 86400000
    timeout connect 86400000
    timeout client 86400000
    timeout queue   1000s
frontend http-in
    bind *:80
    default_backend    backend_servers
    option             forwardfor

backend backend_servers
    balance            roundrobin
    server             www01 192.168.121.201:80 check
    server             www02 192.168.121.202:80 check
EOD
systemctl restart haproxy
else
echo "haproxy is already installed"
fi

Testing the HAProxy setup

192.168.121.202 two.vagrant.box   // webserver two
192.168.121.200 ha.vagrant.box    // ha proxy machine
192.168.121.201 one.vagrant.box   // webserver one

Check haproxy status:

$ vagrant ssh ha
[vagrant@ha ~]$ sudo systemctl status haproxy
โ— haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2018-03-27 11:25:41 UTC; 11min ago

Check load balancing with curl:

$ curl ha.vagrant.box
two.vagrant.box

$ curl ha.vagrant.box
one.vagrant.box