Спеціальна сторінка помилок 503 із лаком


15

Як я можу сказати Varnish, щоб він відображав користувальницьку сторінку помилок у форматі html замість типового повідомлення "Guru Meditation" ?


Можна зробити з деяким рядком
3molo

Спасибі, чому ви не зробите на цей коментар запропоновану відповідь?
Крістіан Давен

Відповіді:


13

Varnish FAQ пропонує використовувати vcl_error для цього (і це, як я зробив це):

Це стандартний VCL для сторінки помилок:

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

якщо ви хочете користувацьку версію, просто замініть функцію у вашому конфігурації та замініть розмітку в syntheticоператорі.

Якщо ви хочете мати різні розмітки для різних кодів помилок, ви можете зробити це досить легко:

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

це не працює у VCL 4.0 - якщо ви використовуєте vcl 4.0, тоді дивіться відповідь нижче
Філіп

18

Зауважте, що вищевказані відповіді стосуються лаку 3. Оскільки в запитанні не вказана інформація про версію, здається, що відповідь для версії 4 також є відповідною зміною.

Сподіваємось, це допоможе врятувати людей від читання вищезазначених відповідей та введення vcl_error у свій V4 VCL :)

Вбудований VCL для лаку 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);
}

Зауважте також, що якщо ви хочете видалити помилку в межах свого VCL, ви більше не використовуєте функцію 'error', натомість ви зробите:

return (synth(405));

Крім того, 413, 417 та 503 помилки з бекенда автоматично перемикаються через цю функцію.


Зауважте, що це не буде фіксувати "помилки завантаження". Щоб захопити їх, ви також повинні створити sub vcl_backend_error, як ви бачите на сервері defaultfault.com/a/665917/102757 та serverfault.com/a/716767/102757
lucaferrario
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.