Назад | Перейти на главную страницу

Как я могу использовать собственный документ об ошибке 503, когда HAProxy отправляет HTTP-код 503?

Я хотел бы, чтобы haproxy использовал свою собственную страницу документа 503, когда задний сервер (бэкэнд) отправляет код HTTP 503. Является ли это возможным?

Видели что-то вроде условий «сбой монитора», но не знаю, как добавить это в интерфейс.

Вы можете использовать errorfile директива, а затем пользовательский .http текстовый файл. Так например:

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

Тогда содержимое файла будет примерно таким:

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>

В errorfile Директива также может быть специфичной для серверной части.

Параметр «errorfile» не может использоваться для изменения ответа, отправляемого HAProxy, если узлы находятся в сети. Этот параметр влияет только на HAProxy, когда все узлы отключены.

Важно понимать, что это ключевое слово не предназначено для перезаписи ошибок, возвращаемых сервером, а ошибок, обнаруженных и возвращенных HAProxy. Поэтому список поддерживаемых ошибок ограничен небольшим набором.

Ты можешь сделать что-нибудь грязное. Вы можете заблокировать ответы 503, что приведет к возврату настраиваемой ошибки 502, для которой вы можете создать страницу ошибки. Однако имейте в виду, что по любой причине, по которой haproxy должен вернуть 502 (неверный ответ), вернет то же самое.

По сути, это так же просто, как "rspdeny ^ HTTP / 1.1 503" в сочетании с "errorfile 502".

У нас есть часть нашего веб-сайта, работающая в устаревшей системе, и в итоге я использовал следующее:

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

acl is_internal_error status ge 500

rspideny . if is_internal_error

Надеюсь, это поможет (даже если это произойдет через 8 месяцев).