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

Совет по настройке HAProxy + Varnish

Я использую HAProxy для балансировки нагрузки на кучу PHP-серверов и сейчас хочу представить Varnish на сцене.
HAP отправляет запрос в Varnish, если файл cookie для входа в приложение недоступен, Varnish не должен делать здесь ничего, кроме обслуживания запроса (Cache HIT) или отправки его обратно в HAP в случае Cache MISS, HAP затем выбирает сервер PHP и извлекаются ресурсы от него и передается клиенту HAP через Varnish. У меня есть следующий файл конфигурации.
Я не понимаю двух вещей здесь;

  1. в сценарии пропуска кеша varnish возвращает запрос HAP, который проверяет cookie-файл для входа в приложение, не находит его и отправляет обратно в varnish (ситуация с отсутствием цикла), я могу установить Varnish cookie и сделать HAP для проверки это и выберите бэкэнд серверов PHP на этой основе (предложения приветствуются).
  2. Во-вторых, как я могу добиться этого, когда ресурсы извлекаются HAP, в случае MISS он отправляется в varnish, а затем подается клиенту, таким образом Varnish в конечном итоге создает кеш.

Пожалуйста, дайте мне знать, если здесь упущено что-то важное.

заранее спасибо

Файл конфигурации

#BE for Varnish is HAP in this machine 
backend default {
.host = "127.0.0.1";
.port = "80";
}

sub vcl_recv {
# HAP sends request to Varnish iff app-login cookie is not available
# Varnish doesnt have to do anything here except to serve request(Cache HIT) or
# send it back to HAP incase of Cache MISS, resouces are then fetched from PHP servers 
# and served to client by HAP through Varnish

# We unset the cookies here as they dont affect the response
 unset req.http.cookie;
# Lighttpd is already compressing resources, so we dont do it here.
 return (lookup); # Control is passed to vcl_hit or vcl_miss 
}
sub vcl_hit {
 return (deliver);
}

sub vcl_miss {
 return (fetch);
}

sub vcl_fetch {
  set obj.ttl = 1m;
  return (deliver);
}

sub vcl_deliver {
 if (obj.hits > 0) {
            set resp.http.X-Cache = "HIT";
    } else {
            set resp.http.X-Cache = "MISS";
    }
 return (deliver);
}

sub vcl_init {
  return (ok);
}

sub vcl_fini {
   return (ok);
}

Благодаря Батисту Ассманну я смог получить ответ для пункта 2, который я спросил: как только PHP-сервер отвечает на HAProxy, ответ следует по обратному пути, поэтому ответ проходит через Varnish (поэтому он кэшируется), затем возвращается в HAProxy, затем клиент.

Для точки 1 условие цикла, о котором я упоминал (снова спасибо Батисту), можно исправить, поместив ACL в конфигурацию HAP, которая направляет трафик на серверы PHP (я использую IP-адрес Varnish в качестве условия), поэтому, когда происходит промах в кеше, HAP получает запрос от Varnish, извлекает ресурсы, следует обратным путем и переходит к Varnish, затем к HAP и, наконец, к пользователю. Я проверил это условие, и в журналах HAP четко указано, что оно работает:

108.108.108.108:21478 [08/Jan/2013:11:58:16.**637**] inbound varnish/varnish0 1/0/0/1803/2182    200 45872 – - —- 2/2/0/1/0 0/0 {abc.xxx.com} “GET / HTTP/1.1″

192.168.1.1:37029 [08/Jan/2013:11:58:16.**639**] inbound worker/worker0 0/0/0/1796/1802 200 45776 – - –NI 2/2/0/1/0 0/0 {abc.xxx..com} “GET / HTTP/1.1″

Вызов поступает на HAP, и, поскольку cookie недоступен, HAP отправляет его на varnish, происходит промах кеша, и worker0 используется для получения ресурсов HAP. В следующем вызове (я кэширую на 1 мес.) Varnish обслуживает все из кеша (varnishlog сообщил мне об этом), и с серверами PHP не связываются.

Спасибо