如何自定义 503 错误 - varnish 4

Posted

技术标签:

【中文标题】如何自定义 503 错误 - varnish 4【英文标题】:how to customize 503 error - 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 错误似乎避免了这种情况。

【问题讨论】:

【参考方案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)

以上是关于如何自定义 503 错误 - varnish 4的主要内容,如果未能解决你的问题,请参考以下文章

如何解决有关自定义 500 和 503 错误页面的问题

Varnish CentOS - 错误 503 后端获取失败

Varnish/Apache 随机 503 错误

从 servlet java 抛出的自定义 503 错误页面

设置上的 Varnish 错误 503

IIS 7.5 自定义 503 错误页面