Autres versions

Vous êtes ici : Installer et exploiterInstallationServeur applicatif

Installation HAProxy

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

HA-Proxy

Description

HAProxy signifie High Available Proxy.

Il s'agit d'un proxy HTTP(S) ou TCP permettant de mettre en place des architectures en load-balancing afin de garantir un haut taux de disponibilité.

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 intéressantes

  • HTTPS : le HAProxy peut être configuré pour traiter les paquets HTTPS (depuis la version 1.5)
  • 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-ends 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
 

Installation

Debian

sudo apt update
sudo apt install haproxy

Configuration

La configuration du HAProxy se fait dans le fichier 

/etc/haproxy/haproxy.cfg

Exemple de configuration

Ci-dessous la configuration du HAProxy pour :

  • déclaration de deux front-ends :
    • 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 de l'HTTPS

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

Donc afin qu'Apache et par conséquent Tomcat ait l'information que l'appel d'origine est en HTTPS il faut :

  • ajouter la ligne suivant dans les VirtualHosts
    SetEnvIfNoCase X-Forwarded-Proto HTTPS HTTPS=on
  • 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 noeud 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
</IfModule>

 

Mis à jour le 22 juin 2018