
Estoy usando Varnish-3.0.5 en Scientific Linux 6.4 (64 bits):
$ 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>
$
Estoy tratando de descubrir cómo puedo configurar el host virtual predeterminado tal como lo obtengo Error 503 Service Unavailable
si al menos uno de mis servidores está inactivo cada vez que ejecuto curl
contra la dirección IP. ¿Debo especificar la dirección IP también req.http.host
dentro de vcl_recv()
para dejar de recibir 503? ¿O de qué otra manera especifico qué host virtual es el predeterminado?
Respuesta1
En primer lugar, déjame decirte que es bastante difícil dar consejos sin ver tu configuración VCL real.
Para responder a su pregunta real
Puede configurar un host predeterminado al comienzo de su servidor vcl_recv
; tenga en cuenta que su(s) backend(s) deben configurarse para responder a ese host exacto.
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";
}
# ...
}
Creo que no tienes que meterte con las IP y req.http.host
, mejor deberías usar curl para pasar un encabezado de host para barnizar (algo como curl -H "Host: your.default.host.tld" http://XX.XX.XX.XXX/
)
Algunas sugerencias generales sobre el tema:
Agregue lógica de control que se comporta mal a su VCL [1]
¿Estás configurando tu backend correctamente?
Recuerde que el barniz utilizará el backend (o director) "predeterminado" a menos que se le indique que use otro en su lógica VCl.
Agregue sondas de estado y vea qué backends están fallando
Utilice sondas de estado consistentes [2] y use el comando de línea de comandos; varnishadm debug.health
consulte los documentos para una mejor comprensión [3]
Agregue una lógica de reinicio a su error de vlc
Algo como esto
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);
}
Agregue lógica de depuración a su respuesta sintética de error de vlc
Recuerde que puede agregar encabezados de depuración al vcl_fetch
pasar el código de error de backend a su respuesta de error de barniz:
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