как настроить ошибку 503 - лак 4

Как я могу настроить «503 backend fetch failed» в Varnish 4?

Я настраиваю другие ошибки, когда они проходят стадию синтеза:

sub vcl_synth {
    if (resp.status == 750) {
        set resp.http.location = "http://mobile.cronica.com.ar/";
        set resp.status = 302;
        set resp.http.Action = "Redirect";  
        return(deliver);
    }
    if (resp.status == 751) {
        set resp.status = 301;
        set resp.http.location = "http://www." + req.http.host + req.url;
        set resp.http.Action = "Redirect";
        return(deliver);
    }
    else {
         synthetic( {"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head>
    <title>"} + resp.status + " " + resp.reason + {"</title>
    <link href='http://fonts.googleapis.com/css?family=Oswald:400,700' rel='stylesheet' type='text/css'>

  </head>
  <body style="background-color:#444; font-family: 'Oswald', sans-serif;">
    <h1 style="color:#DD8363;">Error "} + resp.status + " " + {"</h1>
    <p style="color:#5F88C4; ">"} + resp.reason + {"</p>
    <h3 style="color:white;">CEPI Says</h3>
    <p style="color:#bdb76b;">XID: "} + req.xid + {"</p>
    <p style="color:#bdb76b;">Edge-Server: "} + server.hostname + {"</p>
    <hr>
    <p style="color:#65b042;">2.0</p>
  </body>
</html>
"} ); 
        return(deliver);
    }

}

но ошибка 503, похоже, позволяет избежать этого.


person nlopez    schedule 28.01.2015    source источник


Ответы (1)


Согласно состояния обработки Varnish, управление после backend_error() должно быть передано vcl_synth() , но на самом деле страница ошибки, которую вы видите, безоговорочно доставляется в backend_error() из builtin.vcl. Либо вы настраиваете свою веб-страницу там, либо добавляете sub vcl_backend_error { return(retry); } в свой vcl, чтобы принудительно перейти к vcl_synth(), что будет с resp.status = 503.

person Jorge Nerín    schedule 28.01.2015
comment
Большой! это решение. Еще один вопрос: есть ли способ поместить server.hostname (имя хоста пограничного сервера) в сообщение об ошибке в этой подпрограмме (vcl_backend_error)? - person nlopez; 30.01.2015
comment
Я не уверен в том, какое имя хоста вы хотите, server.hostname доступен в vcl_synth (тот, который получил запрос клиента), а beresp.backend.name, beresp.backend.ip доступны в vcl_backend_error (бэкэнд, вызвавший ошибку, или (null), если нет доступного бэкенд). В моем тесте с new vdir = directors.round_robin(); и без живых бэкендов beresp.backend.name + beresp.backend.ipvdir (null) - person Jorge Nerín; 30.01.2015