HAProxy 发送 503 HTTP 代码时如何使用自定义 503 错误文档?

Mar*_*cin 22 haproxy http-status-code

当后端服务器(后端)发送 HTTP 503 代码时,我希望 haproxy 使用它自己的 503 文档页面。是否可以?

见过类似“监控失败”的情况,但不知道如何将其添加到前端。

Kyl*_*ndt 24

您可以使用该errorfile指令,然后使用自定义.http文本文件。例如:

errorfile 503 /etc/haproxy/errors/503-mycustom.http
Run Code Online (Sandbox Code Playgroud)

文件的内容将类似于:

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>
Run Code Online (Sandbox Code Playgroud)

errorfile指令也可以特定于后端。

如果节点在线,则“errorfile”设置不能用于更改 HAProxy 发送的响应。此设置仅在所有节点都离线时影响 HAProxy。

重要的是要理解这个关键字并不是要重写服务器返回的错误,而是由 HAProxy 检测和返回的错误。这就是为什么支持的错误列表仅限于一小部分的原因。

  • 请注意,.http 文件必须使用 `\r\n` 作为标头中的换行符以符合 HTTP 协议规范。如果从 windows box 上传,请确保使用 `binary` 模式进行 s/ftp 文件传输,以跳过将 windows 换行符 `\r\n` 转换为 unix 样式换行符 `\n`。 (2认同)

Wil*_*eau 6

你可以做一些肮脏的事情。您可以阻止响应 503,这将导致返回自定义 502 错误,您可以为其构建错误页面。但是,请记住,haproxy 必须返回 502(无效响应)的任何原因都将返回相同的内容。

基本上它就像“rspdeny ^HTTP/1.1 503”结合“errorfile 502”一样简单。


Mat*_*man 5

我们网站的一部分运行在旧系统上,我最终使用了以下内容:

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

acl is_internal_error status ge 500

rspideny . if is_internal_error
Run Code Online (Sandbox Code Playgroud)

希望它有所帮助(即使是 8 个月后)。