Comment puis-je utiliser un document d'erreur 503 personnalisé lorsque HAProxy envoie un code HTTP 503?

20

Je voudrais que haproxy utilise sa propre page de document 503 lorsque le serveur (backend) envoie le code HTTP 503. C'est possible?

J'ai vu quelque chose comme des conditions de "défaillance du moniteur" mais je ne sais pas comment l'ajouter au frontend.

Marcin
la source

Réponses:

23

Vous pouvez utiliser la errorfiledirective, puis un .httpfichier texte personnalisé . Ainsi, par exemple:

errorfile 503 /etc/haproxy/errors/503-mycustom.http

Le contenu du fichier serait alors quelque chose comme:

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

<html> 
  <head>
    <title>RARRR!!!!!</title>
  </head> 
  <body style="font-family:Arial,Helvetica,sans-serif;">
    <div style="margin: 0 auto; width: 960px;"> 
          <h2 >RAWR RAWR RAWR</h2>
    </div>
  </body> 
</html>

La errorfiledirective peut également être spécifique à un backend.

Le paramètre "errorfile" ne peut pas être utilisé pour modifier une réponse envoyée par HAProxy si les nœuds sont en ligne. Ce paramètre n'affecte HAProxy que lorsque tous les nœuds sont hors ligne.

Il est important de comprendre que ce mot clé n'est pas destiné à réécrire les erreurs renvoyées par le serveur, mais les erreurs détectées et renvoyées par HAProxy. C'est pourquoi la liste des erreurs prises en charge est limitée à un petit ensemble.

Kyle Brandt
la source
2
Notez que le fichier .http doit utiliser \r\npour les sauts de ligne dans les en-têtes pour se conformer à la spécification du protocole HTTP. Si vous téléchargez à partir d'une boîte Windows, assurez-vous d'utiliser le binarymode de transfert de fichiers s / ftp pour ignorer la conversion des sauts de ligne Windows en sauts \r\nde ligne de style Unix \n.
wqw
6

Vous pouvez faire quelque chose de sale. Vous pouvez bloquer les réponses 503, ce qui entraînera le retour de l'erreur 502 personnalisée pour laquelle vous pouvez créer une page d'erreur. Cependant, gardez à l'esprit que toute raison pour laquelle un proxy devrait retourner un 502 (réponse invalide) retournera la même chose.

Fondamentalement, c'est aussi simple que "rspdeny ^ HTTP / 1.1 503" combiné avec "errorfile 502".

Willy Tarreau
la source
5

Nous avons une partie de notre site Web fonctionnant sur un système hérité, et j'ai fini par utiliser ce qui suit:

errorfile 502 /etc/haproxy/errors/502.http

acl is_internal_error status ge 500

rspideny . if is_internal_error

J'espère que ça aide (même si c'est 8 mois plus tard).

Matt Beckman
la source