
Ich verwende Varnish-3.0.5 auf Scientific Linux 6.4 (64 Bit):
$ rpm -q varnish
varnish-3.0.5-1.el5.centos.x86_64
$ cat /etc/redhat-release
Scientific Linux release 6.4 (Carbon)
$ uname -a
Linux XXX.XXX.XXX 2.6.32-358.23.2.el6.x86_64 #1 SMP Wed Oct 16 11:13:47 CDT 2013 x86_64 x86_64 x86_64 GNU/Linux
$ curl XXX.XX.XX.XXX
<html>
<head>
<title>Page Unavailable</title>
<style>
body { background: #303030; text-align: center; color: white; }
#page { border: 1px solid #CCC; width: 500px; margin: 100px auto 0; padding: 30px; background: #323232; }
a, a:link, a:visited { color: #CCC; }
.error { color: #222; }
</style>
</head>
<body onload="setTimeout(function() { window.location = '/' }, 5000)">
<div id="page">
<h1 class="title">Page Unavailable</h1>
<p>The page you requested is temporarily unavailable.</p>
<p>We're redirecting you to the <a href="/">homepage</a> in 5 seconds.</p>
<div class="error">(Error 503 Service Unavailable)</div>
</div>
</body>
</html>
$
Ich versuche herauszufinden, wie ich den Standard-Virtual-Host so konfigurieren kann, wie ich ihn bekomme, Error 503 Service Unavailable
wenn mindestens eines meiner Back-Ends ausfällt, wenn ich curl
mit der IP-Adresse arbeite. Muss ich req.http.host
auch die IP-Adresse angeben vcl_recv()
, damit ich nicht mehr 503 bekomme? Oder wie gebe ich sonst an, welcher Virtual-Host der Standard ist?
Antwort1
Lassen Sie mich zunächst sagen, dass es ziemlich schwierig ist, Ratschläge zu geben, ohne Ihre tatsächliche VCL-Konfiguration gesehen zu haben.
Um Ihre eigentliche Frage zu beantworten
Sie können zu Beginn einen Standardhost festlegen vcl_recv
. Beachten Sie, dass Ihr(e) Backend(s) so konfiguriert sein sollten, dass sie auf genau diesen Host antworten.
sub vcl_recv {
/* set a default host if no host is provided on the request or if it is empty */
if ( ! req.http.host
|| req.http.host == "") {
set req.http.host = "your.default.host.tld";
}
# ...
}
Ich denke, Sie müssen sich nicht mit IPs und herumschlagen req.http.host
, Sie sollten besser curl verwenden, um einen Host-Header an Varnish zu übergeben (so etwas wie curl -H "Host: your.default.host.tld" http://XX.XX.XX.XXX/
)
Einige allgemeine Vorschläge zum Thema:
Fügen Sie Ihrer VCL fehlerhafte Steuerlogik hinzu [1]
Richten Sie Ihr Backend richtig ein?
Denken Sie daran, dass Varnish das „Standard“-Backend (oder den „Standard-Director“) verwendet, sofern Sie nicht angewiesen werden, in Ihrer VCl-Logik etwas anderes zu verwenden.
Fügen Sie Integritätstests hinzu und sehen Sie, welche Backends ausfallen.
Verwenden Sie konsistente Integritätsprüfungen [2] und verwenden Sie Kommandozeilenbefehle. varnishadm debug.health
Weitere Informationen finden Sie in der Dokumentation [3].
Fügen Sie Ihrem VLC-Fehler eine Neustartlogik hinzu
Etwas wie das
sub vcl_error {
# ...
/* Try to restart request in case of failure */
if (obj.status == 503 && req.restarts < 5) {
set obj.http.X-Restarts = req.restarts;
return(restart);
}
# Before any deliver
return (deliver);
}
Fügen Sie Ihrer synthetischen VLC-Fehlerantwort eine Debug-Logik hinzu
vcl_fetch
Denken Sie daran, dass Sie beim Übergeben des Backend-Fehlercodes Debug-Header an Ihre Varnish-Fehlerantwort hinzufügen können :
sub vcl_fetch {
# ...
set beresp.http.X-Debug-Backend-Code = beresp.status;
# ...
}
sub vcl_error {
# ...
synthetic {""
# Insert the following at the end of your current response
<p>Backend Status code was "} + obj.http.X-Debug-Backend-Code + {"</p>
</body>
</html>
"};
# ...
return (deliver);
}
[1]https://www.varnish-cache.org/docs/3.0/tutorial/handling_misbehaving_servers.html
[2]https://www.varnish-cache.org/docs/3.0/reference/vcl.html#backend-probes
[3]https://www.varnish-cache.org/trac/wiki/BackendPolling#CLIcommands