Назад | Перейти на главную страницу

Указание виртуального хоста по умолчанию для varnish

Я использую Varnish-3.0.5 в Scientific Linux 6.4 (64 бит):

$ 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>
$ 

Я пытаюсь понять, как мне настроить виртуальный хост по умолчанию, когда я получаю Error 503 Service Unavailable если хотя бы один из моих серверов не работает, когда я запускаю curl против IP-адреса. Нужно ли мне указывать IP-адрес в req.http.host а также внутри vcl_recv() чтобы я перестал получать 503? или как еще указать, какой виртуальный хост используется по умолчанию?

Прежде всего позвольте мне сказать, что довольно сложно давать советы, не увидев вашу фактическую конфигурацию VCL.

Чтобы ответить на ваш актуальный вопрос

Вы можете установить хост по умолчанию в начале вашего vcl_recv, обратите внимание, что ваш сервер (ы) должен быть настроен для ответа на этот конкретный хост

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

}

Думаю, с IP-адресами и req.http.host, вам лучше использовать curl для передачи заголовка хоста в лак (что-то вроде curl -H "Host: your.default.host.tld" http://XX.XX.XX.XXX/)


Некоторые общие предложения по теме:

Добавьте некорректную логику управления в свой VCL [1]

Правильно ли вы настраиваете серверную часть?

Помните, что varnish будет использовать серверную часть (или директор) "по умолчанию", если не указано иное в вашей логике VCl.

Добавьте тесты работоспособности и посмотрите, какие серверные ВМ дают сбой

Используйте согласованные пробы работоспособности [2] и используйте команду командной строки varnishadm debug.health см. документацию для лучшего понимания [3]

Добавьте логику перезапуска к вашей ошибке vlc

Что-то вроде этого

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

Добавьте логику отладки в синтетический ответ об ошибке vlc

Помните, что вы можете добавлять заголовки отладки на vcl_fetch передача кода ошибки серверной части в ответ об ошибке varnish:

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