Especificación del host virtual predeterminado de Barniz

Especificación del host virtual predeterminado de Barniz

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 Unavailablesi al menos uno de mis servidores está inactivo cada vez que ejecuto curlcontra la dirección IP. ¿Debo especificar la dirección IP también req.http.hostdentro 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.healthconsulte 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_fetchpasar 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

información relacionada