Haproxy 1.6

Logo

Haproxy est un serveur proxy et un répartiteur de charge pour les contraintes de haute-dsiponibilité. É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 librairies 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>

Lire les commentaires

(Source: LinuxFr.org : les dépêches)