Como posso usar um documento de erro 503 personalizado quando o HAProxy envia um código HTTP 503?

20

Gostaria que o haproxy usasse sua própria página de documento 503 quando o servidor back-end (back-end) envia o código HTTP 503. É possível?

Já vi algo como "falha no monitor", mas não sabe como adicioná-lo ao frontend.

Marcin
fonte

Respostas:

22

Você pode usar a errorfilediretiva e, em seguida, um .httparquivo de texto personalizado . Então, por exemplo:

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

O conteúdo do arquivo seria algo como:

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>

A errorfilediretiva também pode ser específica para um back-end.

A configuração "errorfile" não pode ser usada para alterar uma resposta enviada pelo HAProxy se os nós estiverem online. Essa configuração afeta apenas o HAProxy quando todos os nós estão offline.

É importante entender que essa palavra-chave não deve reescrever erros retornados pelo servidor, mas erros detectados e retornados pelo HAProxy. É por isso que a lista de erros suportados é limitada a um pequeno conjunto.

Kyle Brandt
fonte
2
Observe que o arquivo .http deve ser usado \r\npara quebras de linha nos cabeçalhos, para atender à especificação do protocolo HTTP. Se estiver fazendo o upload de uma caixa do Windows, use o binarymodo de transferência de arquivo s / ftp para pular a conversão de quebras de linha do Windows \r\npara quebras de linha no estilo Unix \n.
Wqw
6

Há algo sujo que você pode fazer. Você pode bloquear as respostas 503, o que resultará no retorno do erro 502 personalizado para o qual você pode criar uma página de erro. No entanto, lembre-se de que qualquer motivo para o haproxy ter que retornar um 502 (resposta inválida) retornará a mesma coisa.

Basicamente, é tão simples quanto "rspdeny ^ HTTP / 1.1 503" combinado com "errorfile 502".

Willy Tarreau
fonte
5

Temos uma parte do nosso site em execução em um sistema legado, e acabei usando o seguinte:

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

acl is_internal_error status ge 500

rspideny . if is_internal_error

Espero que ajude (mesmo 8 meses depois).

Matt Beckman
fonte