如何自定义 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.hostname
在vcl_synth
中可用(这是它收到客户端请求的那个),beresp.backend.name
、beresp.backend.ip
在@ 中可用987654334@(产生错误的后端或“(null)”,如果没有可用的后端)。在我使用new vdir = directors.round_robin();
且没有活动后端的测试中beresp.backend.name + beresp.backend.ip
→ vdir (null)
以上是关于如何自定义 503 错误 - varnish 4的主要内容,如果未能解决你的问题,请参考以下文章
Varnish CentOS - 错误 503 后端获取失败