Bagaimana saya bisa menggunakan dokumen kesalahan 503 khusus ketika HAProxy mengirim kode HTTP 503?

20

Saya ingin haproxy menggunakan halaman dokumen sendiri 503 ketika server kembali (backend) mengirim kode HTTP 503. Apa itu mungkin?

Telah melihat sesuatu seperti kondisi "gagal monitor" tetapi tidak tahu cara menambahkannya ke frontend.

Marcin
sumber

Jawaban:

22

Anda dapat menggunakan errorfilearahan dan kemudian .httpfile teks khusus . Jadi misalnya:

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

Konten file kemudian akan menjadi seperti:

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 errorfiledirektif dapat spesifik untuk backend juga.

Pengaturan "errorfile" tidak dapat digunakan untuk mengubah respons yang dikirim oleh HAProxy jika node sedang online. Pengaturan ini hanya memengaruhi HAProxy ketika semua node offline.

Penting untuk dipahami bahwa kata kunci ini tidak dimaksudkan untuk menulis ulang kesalahan yang dikembalikan oleh server, tetapi kesalahan terdeteksi dan dikembalikan oleh HAProxy. Inilah sebabnya mengapa daftar kesalahan yang didukung terbatas pada satu set kecil.

Kyle Brandt
sumber
2
Perhatikan bahwa file .http harus digunakan \r\nuntuk jeda baris di header untuk mematuhi spesifikasi protokol HTTP. Jika mengunggah dari kotak windows pastikan untuk menggunakan binarymode untuk transfer file s / ftp untuk melewati konversi jeda baris windows \r\nke jeda baris unix style \n.
wqw
6

Ada sesuatu yang kotor yang bisa Anda lakukan. Anda dapat memblokir tanggapan 503, yang akan menghasilkan mengembalikan kesalahan 502 kustom yang Anda dapat membangun halaman kesalahan. Namun, perlu diingat bahwa alasan apa pun haproxy harus mengembalikan 502 (tanggapan tidak valid) akan mengembalikan hal yang sama.

Pada dasarnya sesederhana "rspdeny ^ HTTP / 1.1 503" dikombinasikan dengan "errorfile 502".

Willy Tarreau
sumber
5

Kami memiliki sebagian dari situs web kami yang berjalan pada sistem lawas, dan saya akhirnya menggunakan yang berikut:

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

acl is_internal_error status ge 500

rspideny . if is_internal_error

Semoga ini bisa membantu (walaupun 8 bulan kemudian).

Matt Beckman
sumber