Kustom 503 Halaman Kesalahan Dengan Varnish

15

Bagaimana saya bisa memberi tahu Varnish untuk menampilkan halaman kesalahan html khusus alih-alih pesan "Guru Meditasi" default ?

Christian Davén
sumber
Dapat dilakukan dengan beberapa inline C, lihat: mohanjith.net/blog/2009/08/…
3molo
Terima kasih, mengapa Anda tidak membuat komentar itu sebagai jawaban yang disarankan?
Christian Davén

Jawaban:

13

The Varnish FAQ menyarankan menggunakan vcl_error untuk ini (dan itu bagaimana saya sudah melakukannya):

Ini adalah VCL default untuk halaman kesalahan:

sub vcl_error {
    set obj.http.Content-Type = "text/html; charset=utf-8";

    synthetic {"
        <?xml version="1.0" encoding="utf-8"?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        <html>
            <head>
                <title>"} obj.status " " obj.response {"</title>
            </head>
            <body>
                <h1>Error "} obj.status " " obj.response {"</h1>
                <p>"} obj.response {"</p>
                <h3>Guru Meditation:</h3>
                <p>XID: "} req.xid {"</p>
                <address><a href="http://www.varnish-cache.org/">Varnish</a></address>
            </body>
        </html>
    "};
    return(deliver);
}

jika Anda menginginkan versi khusus, cukup timpa fungsi di konfigurasi Anda dan ganti markup dalam syntheticpernyataan.

Jika Anda ingin memiliki markup berbeda untuk kode kesalahan yang berbeda, Anda juga dapat melakukannya dengan cukup mudah:

sub vcl_error {
    set obj.http.Content-Type = "text/html; charset=utf-8";
    if (obj.status == 404) {
        synthetic {"
            <!-- Markup for the 404 page goes here -->
        "};
    } else if (obj.status == 500) {
        synthetic {"
            <!-- Markup for the 500 page goes here -->
        "};
    } else {
        synthetic {"
            <!-- Markup for a generic error page goes here -->
        "};
    }
}
Conor McDermottroe
sumber
ini tidak berfungsi di VCL 4.0 - jika Anda menggunakan vcl 4.0 maka lihat jawaban di bawah ini
Philipp
18

Perhatikan bahwa jawaban di atas adalah untuk Varnish 3. Karena pertanyaan tidak menentukan informasi versi, sepertinya waktu yang tepat untuk memasukkan jawaban untuk Versi 4 juga karena telah berubah.

Semoga ini akan menyelamatkan orang dari membaca jawaban di atas dan memasukkan vcl_error ke V4 VCL mereka :)

Builtin VCL untuk Varnish 4.0

sub vcl_synth {
    set resp.http.Content-Type = "text/html; charset=utf-8";
    set resp.http.Retry-After = "5";
    synthetic( {"<!DOCTYPE html>
<html>
  <head>
    <title>"} + resp.status + " " + resp.reason + {"</title>
  </head>
  <body>
    <h1>Error "} + resp.status + " " + resp.reason + {"</h1>
    <p>"} + resp.reason + {"</p>
    <h3>Guru Meditation:</h3>
    <p>XID: "} + req.xid + {"</p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>
"} );
    return (deliver);
}

Perhatikan juga bahwa jika Anda ingin melempar kesalahan dari dalam VCL Anda, Anda tidak lagi menggunakan fungsi 'kesalahan', sebaliknya Anda akan melakukan:

return (synth(405));

Juga, 413, 417 dan 503 kesalahan dari backend secara otomatis dialihkan melalui fungsi ini.

Tom17
sumber
Harap dicatat bahwa ini tidak akan menangkap "kesalahan pengambilan backend". Untuk menangkapnya, Anda juga harus membuat sub vcl_backend_error, seperti yang Anda lihat di serverfault.com/a/665917/102757 dan serverfault.com/a/716767/102757
lucaferrario