22

I would like haproxy to use its own 503 document page when back server (backend) sends HTTP 503 code. Is it possible?

Have seen something like "monitor fail" conditions but don't know how to add it to the frontend.

mikemaccana
  • 3,070
  • 5
  • 24
  • 29
Marcin
  • 603
  • 4
  • 8
  • 15

3 Answers3

24

You can use the errorfile directive and then a custom .http text file. So for example:

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

Content of the file would then be something like:

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>

The errorfile directive can be specific to a backend as well.

The "errorfile" setting cannot be used to change a response sent by HAProxy if nodes are online. This setting only affects HAProxy when all nodes are offline.

It is important to understand that this keyword is not meant to rewrite errors returned by the server, but errors detected and returned by HAProxy. This is why the list of supported errors is limited to a small set.

hakusaro
  • 103
  • 5
Kyle Brandt
  • 82,107
  • 71
  • 302
  • 444
  • 2
    Note that .http file must use `\r\n` for line breaks in headers to comply with HTTP protocol specification. If uploading from a windows box make sure to use `binary` mode for s/ftp file transfer to skip converting windows line breaks `\r\n` to unix style line breaks `\n`. – wqw Dec 01 '14 at 10:48
6

There is something dirty you can do. You can block responses 503, which will result in returning the custom 502 error for which you can build an error page. However, keep in mind that any reason haproxy would have to return a 502 (invalid response) will return the same thing.

Basically it's as simple as "rspdeny ^HTTP/1.1 503" combined with "errorfile 502".

Willy Tarreau
  • 3,894
  • 1
  • 19
  • 12
5

We have a portion of our website running on a legacy system, and I ended up using the following:

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

acl is_internal_error status ge 500

rspideny . if is_internal_error

Hope it helps (even if it is 8 months later).

Matt Beckman
  • 1,512
  • 17
  • 33