Página de erro 503 personalizada com verniz

15

Como posso dizer ao Varnish para mostrar uma página de erro html personalizada em vez da mensagem padrão "Meditação do Guru" ?

Christian Davén
fonte
Poderia ser feito com alguma linha C, consulte: mohanjith.net/blog/2009/08/...
3molo
Obrigado, por que você não faz desse comentário uma resposta sugerida?
Christian Davén 16/03/11

Respostas:

13

O FAQ do Varnish sugere o uso de vcl_error para isso (e é como eu fiz isso):

Esta é a VCL padrão para a página de erro:

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

se você quiser uma versão personalizada, simplesmente substitua a função na sua configuração e substitua a marcação na syntheticinstrução

Se você deseja ter marcações diferentes para códigos de erro diferentes, também pode fazer isso com bastante facilidade:

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
fonte
isso não funciona no VCL 4.0 - se você usa o vcl 4.0, veja a resposta abaixo #
Philipp Philipp
18

Observe que as respostas acima são para o verniz 3. Como a pergunta não especifica as informações da versão, parece um momento apropriado para incluir a resposta para a versão 4 também conforme ela foi alterada.

Espero que isso evite que as pessoas leiam as respostas acima e coloquem vcl_error na VCL V4 :)

VCL embutido para verniz 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);
}

Observe também que se você deseja gerar um erro de dentro da sua VCL, não usa mais a função 'error', mas faria:

return (synth(405));

Além disso, os erros 413, 417 e 503 do back-end são roteados automaticamente por essa função.

Tom17
fonte
Observe que isso não irá capturar "erros de busca de back-end". Para capturá-los, você também deve criar um sub vcl_backend_error, como você pode ver em serverfault.com/a/665917/102757 e serverfault.com/a/716767/102757
lucaferrario