Vous êtes ici : Installation 7.0 → Pré-requis → Ré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 :
- Ajouter la ligne suivante dans les VirtualHost Apache
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 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
Connectez-vous (avec vos identifiants Communauté) pour suggérer une correction ou un complément :