Wie kann ich ein benutzerdefiniertes 503-Fehlerdokument verwenden, wenn HAProxy einen 503-HTTP-Code sendet?

20

Ich möchte, dass haproxy eine eigene 503-Dokumentseite verwendet, wenn der Back-Server (Back-End) HTTP 503-Code sendet. Ist es möglich?

Ich habe so etwas wie "Monitor Fail" gesehen, weiß aber nicht, wie ich es zum Frontend hinzufügen soll.

Marcin
quelle

Antworten:

22

Sie können die errorfileDirektive und dann eine benutzerdefinierte .httpTextdatei verwenden. Also zum Beispiel:

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

Der Inhalt der Datei würde dann ungefähr so ​​aussehen:

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>

Die errorfileDirektive kann auch spezifisch für ein Backend sein.

Die Einstellung "Fehlerdatei" kann nicht zum Ändern einer von HAProxy gesendeten Antwort verwendet werden, wenn Knoten online sind. Diese Einstellung wirkt sich nur auf HAProxy aus, wenn alle Knoten offline sind.

Es ist wichtig zu verstehen, dass dieses Schlüsselwort nicht dazu gedacht ist, vom Server zurückgegebene Fehler neu zu schreiben, sondern von HAProxy erkannte und zurückgegebene Fehler. Aus diesem Grund ist die Liste der unterstützten Fehler auf einen kleinen Satz beschränkt.

Kyle Brandt
quelle
2
Beachten Sie, dass die HTTP-Datei \r\nfür Zeilenumbrüche in Kopfzeilen verwendet werden muss, um der HTTP-Protokollspezifikation zu entsprechen. Stellen Sie beim Hochladen von einer Windows-Box sicher, dass Sie den binaryModus für die S / FTP-Dateiübertragung verwenden, um das Konvertieren von Windows-Zeilenumbrüchen in Zeilenumbrüche \r\nim Unix-Stil zu überspringen \n.
wqw
6

Sie können etwas Dreckiges tun. Sie können die Antworten 503 blockieren, wodurch der benutzerdefinierte Fehler 502 zurückgegeben wird, für den Sie eine Fehlerseite erstellen können. Beachten Sie jedoch, dass jeder Grund, aus dem haproxy eine 502 (ungültige Antwort) zurückgeben müsste, dasselbe zurückgibt.

Grundsätzlich ist es so einfach wie "rspdeny ^ HTTP / 1.1 503" kombiniert mit "errorfile 502".

Willy Tarreau
quelle
5

Wir haben einen Teil unserer Website auf einem Legacy-System ausgeführt, und am Ende habe ich Folgendes verwendet:

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

acl is_internal_error status ge 500

rspideny . if is_internal_error

Hoffe es hilft (auch wenn es 8 Monate später ist).

Matt Beckman
quelle