Haproxy est un serveur proxy et un répartiteur de charge pour les contraintes de haute-disponibilité. Écrit en C, il a la réputation d'être efficace, simple et rapide. Après 16 mois de développement la nouvelle branche 1.6 est la nouvelle stable, par conséquent une nouvelle branche 1.7 a été crée pour tout nouveau développement. De nombreux ajouts ont vu le jour depuis la version 1.5 et d'autres contributeurs ont rejoint le projet. Actuellement, Haproxy est utilisé par de nombreux sites et services web, tels que Github, Twitter, StackOverflow, Reddit, ainsi que Amazon Web Service.
Nouveautés
- Intégration de Lua.
- Capture slots.
- Nouvelles régles HTTP.
- Nouveaux converters.
- Détection d'appareils mobiles.
- Déclarations de variables.
- Traitement du corps d'une requête HTTP.
- Partage de connection HTTP.
- Lancement de scripts "health check".
Intégration de Lua
C'est clairement la plus importante nouveauté de cette release, elle apporte la possibilité d'étendre les possibilités de base d'Haproxy sans avoir à écrire des modules en C. Les niveaux où Lua peut intervenir :
- Action.
- Service.
- Sample / Fetch et converters.
Cela dit, cela requiert d'avoir installé Lua > 5.3.
Exemple utilisant le module lua MD5
haproxy.cfg:
global
...
lua-load content.lua
...
frontend http-in
...
mode http
http-request use-service lua.content
...
content.lua :
core.register_service("content", "http", function(applet)
local md5 = require("md5")
local content = '{"myjson":1}'
local contentchksum = md5.sumhexa(content)
applet:set_status(200)
applet:add_header("Content-MD5", contentchksum)
applet:add_header("Content-Type", "application/json")
applet:start_response()
applet:send(content)
end)
Capture slots
C'est la possibilité de stocker une donnée en lui attribuant un identifiant comme suit
frontend myfrontend
...
declare capture request len 128
http-request capture req.hdr(User-Agent) id 0
...
backend mybackend
...
http-response set-header X-User-Agent %[capture.req.hdr(0)]
Nouveaux converters
Trop nombreux à énumérer, une liste complète est présentée ici.
Détection d'appareil mobiles
Haproxy supporte désormais la détection d'appareils mobiles via deux bibliothèques tierces, 51 degrees ou DeviceAtlas via l'User-Agent, ou tous les entêtes HTTP via un converter ou un sample / fetch.
Exemple de configuration
global
#### 51 degrees
51degrees-data-file /etc/51Degrees-Premium.dat
51degrees-property-name-list IsMobile DeviceType
51degrees-property-separator ,
51degrees-cache-size 4096
#### DeviceAtlas
deviceatlas-json-file /etc/deviceatlas.json
deviceatlas-property-separator ,
frontend http-in
bind *:8881
default mybackend
#### 51 degrees
#### with sample / fetch
http-request set-header X-51D-IsMobileDeviceType %[51d.all(IsMobile,DeviceType)]
#### with converter
http-request set-header X-51D-IsMobileDeviceType %[req.fhdr(User-Agent),51d.single(IsMobile,DeviceType)]
#### DeviceAtlas
#### with sample / fetch
http-request set-header X-DeviceAtlas-Data %[da-csv-fetch(primaryHardwareType,osName,osVersion,browserName,browserVersion)]
#### with converter
http-request set-header X-DeviceAtlas-Data %[req.fhdr(User-Agent),da-csv-conv(primaryHardwareType,osName,osVersion,browserName,browserVersion)]
Déclaration de variables
Il existe maintenant la possibilite de déclarer (et d'utiliser) une variable comme suit :
...
http-request set-var(txn.whereitcomesfrom) req.hdr(Referer)
...
http-response set-header X-WhereitComesFrom %[var(txn.whereitcomesfrom)]
Traitement du corps d'une requête HTTP
Via la nouvelle option http-buffer-request (niveau frontend ou backend), il est maintenant possible d'attendre que la requête soit complète avant tout traitement ce qui permet par exemple de traiter en fonction du corps de la requête.
Partage de connexion HTTP
Via le nouveau mot-clé http-reuse, il est possible pour plusieurs clients de partager la même connection pour un serveur. Plusieurs politiques sont possibles : never, safe, aggressive, always.
Lancement de scripts « health check »
Via le mot clé external-check, on peut vérifier l'état avec un script externe.
Exemple
global
external-check
backend mybackend
external-check command <my command>
Aller plus loin
- Site officiel (865 clics)
- Brève liste des changements (208 clics)
- Manuel d'utilisation de Cyril Bonté (224 clics)
# MERCI
Posté par Nico C. . Évalué à 6.
Et encore merci à Willy Tarreau et tous les autres contributeurs pour cet "amazing" logiciel.
# bonne nouvelle
Posté par madko (site web personnel) . Évalué à 1.
Bonne nouvelle ça! Il est aussi utilisé chez OVH et même partout ailleurs tellement c'est un incontournable! Pas d'HAproxy pour linuxfr?
ps: conneXion
[^] # Re: bonne nouvelle
Posté par Benoît Sibaud (site web personnel) . Évalué à 8. Dernière modification le 24 octobre 2015 à 18:08.
Non il n'y a qu'un serveur à répartir actuellement.
[^] # Re: bonne nouvelle
Posté par Denis Dordoigne . Évalué à 6.
Désolé de te décevoir, il n'est pas utilisé partout ailleurs et il n'est pas incontournable, j'ai bossé avec des dizaines d'environnements en haute disponibilité, et je n'ai jamais eu à toucher à HAproxy, la plupart du temps je vois des appliances propriétaires pour gérer les fonctionnalités HA. Et même dans les infrastructures 100% libres, HAproxy n'est pas incontournable :
- pour les fonctionnalités de proxy, il y a un paquet de logiciels libres qui répondent à ce besoin (cf. cette dépêche et ses commentaires pour avoir un début de liste
- pour les fonctionnalités de loadbalancing, c'est géré nativement par openbsd (je ne suis pas compétent en la matière, mais on trouve des tutoriaux facilement sur le web, même en français) et par linux (avec LVS, on en avait parlé dans cette dépêche)
Membre de l'april, et vous ? https://april.org/adherer -- Infini, l'internet libre et non commercial : https://infini.fr
[^] # Re: bonne nouvelle
Posté par madko (site web personnel) . Évalué à 3.
J'allais pas faire une liste exhaustive de tous les utilisateurs d'HAproxy, ça m'a semblé plus simple de dire que c'était un incontournable un peu partout. Je me doute qu'il y a des boites qui utilisent des trucs moins bien et plus chers ! Donc pas de soucis, je ne suis pas déçu ! (mon commentaire était plus là pour contrecarrer le coup de pub pour Amazon dans la dépêche)
[^] # Re: bonne nouvelle
Posté par Joris Dedieu (site web personnel) . Évalué à 1.
Amen
# Virtual Host
Posté par Mildred (site web personnel) . Évalué à 8.
Il s'utilise aussi très bien pour gérer des virtual hosts lorsque'on souhaite mixer différents serveurs web derrière (par exemple si tous les services a répartir n'utilisent pas tous Apache, Nginx ou votre serveur favori, ou si vous utilisez des containers Docker qui exposent uniquement un port 80).
Il peut aussi permettre d'ajouter la couche TLS a une connexion HTTP non sécurisée.
Par exemple: https://gitlab.com/mildred593/docker-haproxy
[^] # Re: Virtual Host
Posté par barmic . Évalué à 4.
C'est ce que propose tout serveur reverse proxy http, non ?
En tout cas c'est ce que je fais avec nginx (ainsi que servir directement les fichiers statiques).
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: Virtual Host
Posté par Ludo . Évalué à 6.
En effet.
Hormis en terme d'efficience qui de mes tests donnent l'avantage à HAproxy, Nginx rempli le job de reverse proxy.
# La réécriture d'url
Posté par vujoodha . Évalué à 1.
Très bon article qui résume les grosses avancées.
Mais je reste un peu sur ma fin concernant HAProxy, depuis un certain nombre de version HAProxy ne permet pas de faire de réécriture d'URL dans le body de la réponse.
Est ce toujours le cas avec la version 1.6 ?
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.