Mise en place HaProxy 2.8 sur une Debian 12

 

HaProxy s'est imposé comme la référence des Load Balancer OpenSource.

La nouvelle version 2.8 LTS sortie en Mai 2023, ajoute un certain nombre de fonctionnalités de haut niveau, voir la page d'annonce des nouveautés.

Cet article met largement à jour le précédent article qui datait de 2015.

Prérequis

  • Une Debian 12 toute fraîchement installée
  • Un firewall (sur la machine ou en amont)
  • Une carte réseau connectée sur le réseau extérieur
  • Une carte réseau connectée sur le réseau interne

Schéma

Installation HaProxy 2.8

Pour déployer la dernière version LTS d'HaProxy :

Préparation du fichier haproxy.list

curl https://haproxy.debian.net/bernat.debian.org.gpg gpg --dearmor > /usr/share/keyrings/haproxy.debian.net.gpg
echo deb "[signed-by=/usr/share/keyrings/haproxy.debian.net.gpg]" http://haproxy.debian.net bookworm-backports-2.8 main > /etc/apt/sources.list.d/haproxy.list

Installation :

apt update
apt install haproxy

Configuration basique

Voici une configuration de base avec deux frontend (stats et web) et deux serveurs en backend, ce qui correspond au schéma vu plus haut.

# Paramètres généraux
global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode    http
    option  httplog
    option  dontlognull

    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http

    # Fine tuning
    timeout http-request 5s
    timeout http-keep-alive 2s
    timeout queue 5s
    timeout tunnel 2m
    timeout client-fin 1s
    timeout server-fin 1s
    timeout connect 5000
    timeout client  50000
    timeout server  50000

# Frontends
frontend stats
        bind IP_Externe:8080
        stats enable
        stats hide-version
        stats uri /
        stats realm Haproxy\ Statistics
        stats auth haproxy:monmotdepasse
        stats refresh 10s

frontend sites
    bind IP_Externe:80  alpn h2,h2c,http/1.1
    default_backend web

    # Access log
    log         127.0.0.1    local6
    option httplog

    tcp-request inspect-delay 5s

    # forward header
    option forwardfor

# Backends
backend web
    balance     roundrobin
    server      web01   192.168.33.11:80    check
    server      web02  192.168.33.12:80 check

Paramètres généraux

Dans la partie global : gestion des logs, des utilisateurs et du chroot.

Dans la partie defaults :

  • mode http : configuration pour un load balancer par défaut en http, il sera possible de changer ce mode pour des frontend particuliers
  • errorfile : quelques fichiers par défaut pour les pages d'erreurs typiques, c'est adaptable
  • timeout : une série de configuration pour différents timeout

Frontend stats

C'est le frontend qui permet d'accéder à l'interface de stats de HaProxy, configuré ici sur un port en particulier (à sécuriser).

Frontend sites

  • bind : on écoute ici sur l'ip publique du serveur sur le port 80 avec quelques options pour les différentes versions du protocole http
  • option forwardfor : pour renvoyer vers les backend l'IP source dans les headers

Backend web

Configuration d'un backend en Round-robin vers deux serveurs.

Redémarrage

Reste plus qu'à redémarrer et vérifier que cela fonctionne.

Frontend de stats

Voici ce que cela peut donner

Les logs

Un exemple de logs :

2023-08-10T10:57:44.774297+02:00 ha-lb02 haproxy[248912]: ip_client:56482 [10/Aug/2023:10:57:44.773] stats stats/<STATS> 0/0/0/0/0 200 21683 - - LR-- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
2023-08-10T10:57:45.866177+02:00 ha-lb02 haproxy[248912]: ip_client:39822 [10/Aug/2023:10:57:45.864] sites web/web02 0/0/0/1/1 200 1159 - - ---- 2/1/0/0/0 0/0 "GET / HTTP/1.1"
2023-08-10T10:57:47.600927+02:00 ha-lb02 haproxy[248912]: ip_client:39822 [10/Aug/2023:10:57:47.599] sites web/web01 0/0/0/1/1 200 1159 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"