Я использую HAProxy для балансировки нагрузки на кучу PHP-серверов и сейчас хочу представить Varnish на сцене.
HAP отправляет запрос в Varnish, если файл cookie для входа в приложение недоступен, Varnish не должен делать здесь ничего, кроме обслуживания запроса (Cache HIT) или отправки его обратно в HAP в случае Cache MISS, HAP затем выбирает сервер PHP и извлекаются ресурсы от него и передается клиенту HAP через 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 не связываются.
Спасибо