Jak mogę użyć niestandardowego dokumentu błędu 503, gdy HAProxy wysyła kod HTTP 503?

20

Chciałbym, aby haproxy używał własnej strony dokumentu 503, gdy serwer tylny (backend) wysyła kod HTTP 503. Czy to możliwe?

Widziałem coś w rodzaju „awarii monitora”, ale nie wiem, jak dodać go do interfejsu.

Marcin
źródło

Odpowiedzi:

23

Możesz użyć errorfiledyrektywy, a następnie niestandardowego .httppliku tekstowego. Na przykład:

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

Treść pliku wyglądałaby wtedy jak:

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>

errorfileDyrektywa może być specyficzny dla backend również.

Ustawienie „errorfile” nie może być użyte do zmiany odpowiedzi wysłanej przez HAProxy, jeśli węzły są w trybie online. To ustawienie wpływa tylko na HAProxy, gdy wszystkie węzły są w trybie offline.

Ważne jest, aby zrozumieć, że to słowo kluczowe nie ma na celu przepisywania błędów zwracanych przez serwer, ale błędy wykryte i zwrócone przez HAProxy. Dlatego lista obsługiwanych błędów jest ograniczona do niewielkiego zestawu.

Kyle Brandt
źródło
2
Należy pamiętać, że plik .http musi być używany \r\ndo podziału linii w nagłówkach, aby był zgodny ze specyfikacją protokołu HTTP. Jeśli przesyłasz z okna systemu Windows, upewnij się, że korzystasz z binarytrybu przesyłania plików s / ftp, aby pominąć konwersję podziałów linii systemu Windows \r\nna podział linii w stylu uniksowym \n.
wqw
6

Jest coś brudnego, co możesz zrobić. Możesz zablokować odpowiedzi 503, co spowoduje zwrócenie niestandardowego błędu 502, dla którego możesz zbudować stronę błędu. Należy jednak pamiętać, że każdy powód, dla którego haproxy musiałby zwrócić 502 (nieprawidłowa odpowiedź), zwróci tę samą rzecz.

Zasadniczo jest to tak proste, jak „rspdeny ^ HTTP / 1.1 503” w połączeniu z „errorfile 502”.

Willy Tarreau
źródło
5

Część naszej witryny działa w starszym systemie, a ja skończyłem z następującymi:

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

acl is_internal_error status ge 500

rspideny . if is_internal_error

Mam nadzieję, że to pomaga (nawet jeśli jest to 8 miesięcy później).

Matt Beckman
źródło