Especificando o host virtual padrão do verniz

1

Estou usando o Varnish-3.0.5 no 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>
$ 

Estou tentando descobrir como configurar o host virtual padrão, pois estou obtendo Error 503 Service Unavailable se pelo menos um dos meus back-ends estiver inoperante sempre que eu executar curl no endereço IP. Preciso especificar o endereço IP em req.http.host também dentro de vcl_recv() para que eu pare de obter 503? ou como eu especifico qual host virtual é o padrão?

    
por alexus 05.12.2013 / 19:20

1 resposta

1

Punho de tudo, deixe-me dizer que é muito difícil dar conselhos sem ver sua configuração real do VCL.

Para responder à sua pergunta atual

Você pode definir um host padrão no início de seu vcl_recv , observe que seus back-ends devem ser configurados para responder a esse host exato

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";
  }
  # ...

}

Acho que você não precisa mexer com IPs e req.http.host , é melhor usar o curl para passar um cabeçalho de host para o verniz (algo como curl -H "Host: your.default.host.tld" http://XX.XX.XX.XXX/ )

Algumas sugestões gerais sobre o tema:

Adicione uma lógica de controle mal comportada ao seu VCL [1]

Você está configurando seu back-end corretamente?

Lembre-se de que o verniz usará back-end "padrão" (ou diretor), a menos que seja instruído a usar outro em sua lógica de VCl

Adicione análises de integridade e veja quais back-ins estão falhando

Use testes de saúde consistentes [2] e use o comando da linha de comando varnishadm debug.health para ver os documentos para um melhor entendimento [3]

Adicione uma lógica de reinicialização ao seu erro de vlc

Algo parecido com isto

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);
}

Adicione a lógica de depuração à sua resposta sintética de erro de vlc

Lembre-se de que você pode adicionar cabeçalhos de depuração em vcl_fetch passando o código de erro de backend à sua resposta de erro do verniz:

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] link

[2] link

[3] link

    
por 06.12.2013 / 13:43

Tags