Página de error 503 personalizada con barniz

Respuestas:

13

Las preguntas frecuentes de Varnish sugieren usar vcl_error para esto (y así es como lo hice):

Este es el VCL predeterminado para la página de error:

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);
}

si desea una versión personalizada, simplemente anule la función en su configuración y reemplace el marcado en la syntheticdeclaración.

Si desea tener un marcado diferente para diferentes códigos de error, también puede hacerlo con bastante facilidad:

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
fuente
esto no funciona en VCL 4.0: si usa vcl 4.0, vea la respuesta a continuación
Philipp
18

Tenga en cuenta que las respuestas anteriores son para Varnish 3. Como la pregunta no especifica la información de la versión, parece un momento apropiado para incluir la respuesta para la Versión 4 también porque ha cambiado.

Con suerte, esto evitará que las personas lean las respuestas anteriores y pongan vcl_error en su V4 VCL :)

VCL incorporado para barniz 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);
}

Tenga en cuenta también que si desea lanzar un error desde su VCL, ya no usa la función 'error', en su lugar haría:

return (synth(405));

Además, los errores 413, 417 y 503 del backend se enrutan automáticamente a través de esta función.

Tom17
fuente
Tenga en cuenta que esto no capturará "errores de recuperación de backend". Para capturarlos, también debe crear un sub vcl_backend_error, como puede ver en serverfault.com/a/665917/102757 y serverfault.com/a/716767/102757
lucaferrario