Personnaliser les pages d'erreurs de HAProxy

Temps de lecture estimé : 2 minutes

Quand nous subissons des erreurs HTTP, il est quand même plus agréable d’avoir des pages « corporate » plutôt que les tristes pages blanches avec un gigantesque 4xx / 5xx. Cela permet de mieux informer l’utilisateur final de ce qu’il s’est passé et ce qu’il peut faire pour gérer le cas. Habituellement, c’est le rôle du serveur web de délivrer ces pages d’erreurs. Mais quand il n’y a plus de serveur web pour fournir la moindre page, comment fait-on ?

C’est la colle qu’on m’a posé il y a peu : HAProxy doit afficher une 503 avec la charte graphique de l’entreprise… pour dire qu’il n’y a pas de serveur applicatif disponible !

Il se trouve qu’HAProxy stocke des pages d’erreurs et nous permet, soit de les altérer, soit d’en utiliser d’autres. Voyons comment ça se configure dans le fichier de configuration :

# haproxy.cfg

# [...]
http-errors myerrors
	errorfile 503 /path/vers/mon/fichier/503.http

frontend ft_app
	bind *:80
	errorfiles myerrors
	default_backend bk_app

backend bk_app
	default-server port 80 check
	server mybackend 127.0.0.99 disabled
# [...]

Ledit fichier d’erreur est une combinaison d’instructions HTTP et de HTML :

HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html

<html><body><h1>503 Service Unavailable</h1>
No server is available to handle this request.
</body></html>

Ce que la documentation officielle ne dit pas, c’est comment avoir un rendu web user-friendly ; si vous avez essayé, vous savez que les images et le CSS ne chargent pas.

Avant tout, il faut comprendre qu’HAProxy n’est pas un serveur web, il ne peut donc pas localiser de fichiers sur son système de fichiers. Nous avons donc deux choix possibles :

  • Soit d’importer les ressources nécessaires, i.e. avoir le CSS en style inline et les images en base64,
  • Soit d’utiliser un serveur tiers pour cela, comme un CDN.

Notre fichier devient donc :

HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html; charset=utf-8

<html>
<head>
    <style>
        body { color: #555; background-color: #eee;}
        h1   { color: #ba181a;}
    </style>
</head>
<body>
    <h1>Service indisponible (503)</h1>
    <p><img src="https://redwatch.io/img/logo-WEB.png" alt="logo" />
    <p>Aucun serveur ne peut gérer cette requête.</p>
</body>
</html>

Vous savez désormais comment afficher des messages « propres » côté HAProxy !

Comme d’habitude, vous pouvez retrouver le code pour essayer par vous-même sur le dépôt d’exemple.


Sources :


    Ce billet vous a plu ? Partagez-le sur les réseaux…


    … Ou inscrivez-vous à la newsletter pour ne manquer aucun article (Si vous ne voyez pas le formulaire, désactivez temporairement uBlock).