【问题标题】:how to customize 503 error - varnish 4如何自定义 503 错误 - varnish 4
【发布时间】:2015-03-27 10:28:50
【问题描述】:

如何自定义 Varnish 4 的 '503 backend fetch failed'?

当它们通过合成阶段时,我正在自定义其他错误:

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 错误似乎避免了这种情况。

【问题讨论】:

    标签: error-handling varnish varnish-vcl http-status-code-503


    【解决方案1】:

    根据Varnish Processing States 控制backend_error() 之后应该传递给vcl_synth(),但实际上您看到的错误页面是在backend_error() of builtin.vcl 中无条件传递的。您可以在那里自定义网页,或者在 vcl 中添加 sub vcl_backend_error { return(retry); } 以强制跳转到 vcl_synth(),这将与 resp.status = 503 一起使用。

    【讨论】:

    • 太棒了!这就是解决方案。还有一个问题,有什么办法可以把server.hostname(边缘服务器主机名)放在这个子程序(vcl_backend_error)的错误信息上?
    • 我不确定你想要什么主机名,server.hostnamevcl_synth 中可用(这是它收到客户端请求的那个),beresp.backend.nameberesp.backend.ip 在@ 中可用987654334@(产生错误的后端或“(null)”,如果没有可用的后端)。在我使用new vdir = directors.round_robin(); 且没有活动后端的测试中beresp.backend.name + beresp.backend.ipvdir (null)
    猜你喜欢
    • 2020-06-03
    • 2013-04-12
    • 2012-06-16
    • 2013-12-03
    • 1970-01-01
    • 2016-06-19
    • 2013-02-13
    • 2011-01-17
    • 2011-06-07
    相关资源
    最近更新 更多