Haproxy 1.6

Posté par . Édité par Xavier Claude, palm123, Nÿco, NeoX, tankey, Benoît Sibaud, Nils Ratusznik et ZeroHeure. Modéré par NeoX. Licence CC by-sa
45
23
oct.
2015
Internet

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.

HAProxy

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>
  • # MERCI

    Posté par (page perso) . Évalué à 6.

    Et encore merci à Willy Tarreau et tous les autres contributeurs pour cet "amazing" logiciel.

  • # bonne nouvelle

    Posté par . É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 (page perso) . Évalué à 8. Dernière modification le 24/10/15 à 18:08.

      Pas d'HAproxy pour linuxfr?

      Non il n'y a qu'un serveur à répartir actuellement.

    • [^] # Re: bonne nouvelle

      Posté par . É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 ? http://www.april.org/adherer

      • [^] # Re: bonne nouvelle

        Posté par . É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 (page perso) . Évalué à 1.

        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,

        Amen

  • # Virtual Host

    Posté par (page perso) . É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 . É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 (page perso) . É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 . É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 à ceux qui les ont postés. Nous n'en sommes pas responsables.