Autres versions

Vous êtes ici : Installation 7.0Pré-requisRépartiteur de charge

Répartiteur de charge

Procédure d'installation du serveur HAProxy

Installation et configuration d'HAProxy pour un cluster applicatif K-Sup.

Usage

Le serveur HAProxy (High Available Proxy) est un proxy HTTP(S) ou TCP permettant de mettre en place des architectures en load-balancing afin de garantir un taux de disponibilité élevé.

Site officiel : http://www.haproxy.org/

Quelques éléments de vocabulaire

  • Front-end : Entrée, reçoit les requêtes entrantes
  • Back-end : Sortie, traite les requêtes
  • ACL : règle/condition (restriction d'URL ou autre)

Fonctionnalités à retenir

  • Prise en charge du HTTPS : le HAProxy peut être configuré pour traiter les paquets HTTPS (depuis la version 1.5)
  • Il propose plusieurs algorithmes de load-balancing. Cependant, l'algorithme "round-robin" correspond aux besoins de K-Sup
  • Faire du routage conditionnel vers les "back-end"
  • Le balancing peut être statique (via un cookie dans les en-têtes HTTP), c'est-à-dire qu'un client sera toujours dirigé sur les mêmes "back-end"
  • Le serveur HAProxy peut faire des pings des "back-end" afin de connaître l'état de la route (action ou inactif). Il s'agit de l'utilisation d'une sonde portée par l'application K-Sup (par défaut, la page d'accueil).
  • Ajouter des informations dans les en-têtes HTTP

Liens avec les autres serveurs

Type de lien Serveur Port Remarques
Sortant Serveur applicatif 80 Permet de transférer les requêtes HTTP reçues au serveur applicatif faisant office de back-end

Installation

sudo apt install haproxy

Configuration

La configuration du HAProxy se fait dans le fichier /etc/haproxy/haproxy.cfg

Exemple de configuration

Ci-dessous un exemple de configuration du HAProxy pour :
  • Déclaration de deux "front-end" :
    • un HTTP (port 80) : redirigeant les appels vers les front-end HTTPS
    • un HTTPS (port 443) :
      • Transfert des appels back-end tomcat
      • Ajout dans l'en-tête HTTP du "proto https" pour que apache puisse savoir que l'appel initial est en HTTPS
  • Déclaration d'un "back-end" :
    • En load-balancing round-robin
    • Routing statique des serveurs
    • Ping des serveurs pour connaître leur état
    • Déclaration des serveurs
global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        user haproxy
        group haproxy
        daemon
 
        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private
 
        # Configuration SSL générée par https://mozilla.github.io/server-side-tls/ssl-config-generator/ pour haproxy 1.7.x
        # Oldest compatible clients: Firefox 1, Chrome 1, IE 7, Opera 5, Safari 1, Windows XP IE8, Android 2.3, Java 7
        # set default parameters to the intermediate configuration
        tune.ssl.default-dh-param 2048
        ssl-default-bind-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
        ssl-default-bind-options no-sslv3 no-tls-tickets
        ssl-default-server-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
        ssl-default-server-options no-sslv3 no-tls-tickets
  
  
        # Création d'une socket utilisée par la supervision par un outil de monitoring
        # Peut aussi être utilisé pour consulter les statistiques de HAProxy : hatop -s /var/run/haproxy.socket
        stats  socket /var/run/haproxy.socket 


defaults
        log     global
        mode    http
        maxconn 10000
 
        option  httplog
        option  dontlognull
        option  httpclose
        option  forwardfor
 
        timeout connect 5s
        timeout client  30s
        timeout server  30s
        timeout queue   5s
        timeout check   3s
        timeout http-request    15s
        timeout http-keep-alive 30s
 
        # erreur lorsque qu'un back-end est inaccessible
        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                                                   
 
frontend req_http
        bind    *:80
        redirect        scheme https if !{ ssl_fc }


frontend req_https
        bind    *:443   ssl crt /etc/ssl/my_ssl/haproxy.pem
        reqadd  X-Forwarded-Proto:\ https
        default_backend tomcat
 

backend tomcat
        balance roundrobin
        cookie  SERVERID insert indirect nocache
        # permet de casser la persistance du balancing si un serveur est inaccessible
        option  redispatch
        # ping des serveurs pour connaître leur état
        option  httpchk GET / HTTP/1.1\r\nHost:\ www
        # déclaration des serveurs qui composent le balancing (dans /etc/hosts ou accessible par dns)
        server  tc1 tomcat1:80 check cookie tc1
         
        # Ajout d'un serveur supplémentaire
        # server  tc2 tomcat2:80 check cookie tc2

Cohabitation avec Apache

Prise en compte du HTTPS

Rappel Si le HAProxy déchiffre les appels HTTPS, il les transfère en HTTP à ses back-end.

Afin qu'Apache et Tomcat, soient informés que l'appel d'origine est en HTTPS, il faut :

  1. Ajouter la ligne suivante dans les VirtualHost Apache
    SetEnvIfNoCase X-Forwarded-Proto HTTPS HTTPS=on
  2. S'assurer que la ligne de configuration HAProxy suivante figure bien dans la déclaration du "front-end"
    reqadd  X-Forwarded-Proto:\ https

Mise à jour des LOG Apache

Afin de faire figurer dans les logs d'Apache les IPs des clients à l'origine des appels et non l'IP du HAProxy, il est nécessaire de d'installer un nouveau module : mod_remoteip.
Avant tout, il faut s'assurer que la ligne de configuration HAProxy suivante figure bien dans la configuration :

option  forwardfor

Installation et activation du module sur le nœud applicatif (Tomcat / Apache)

a2enmod remoteip
Mise à jour des VirtualHosts pour intégrer le module :
<IfModule remoteip_module>
    RemoteIPHeader X-Client-IP
    RemoteIPHeader X-Forwarded-For
    RemoteIPInternalProxy IP_PRIVEE_DE_VOTRE_HAPROXY
</IfModule>

Mis à jour le 15 mai 2024