Conselho de configuração do HAProxy + Varnish

1

Estou usando o HAProxy para balancear a carga de vários servidores PHP e quero introduzir o Varnish na cena agora.
HAP envia um pedido para o Varnish se o cookie app-login não estiver disponível, o Varnish não precisa fazer nada aqui, exceto para servir o pedido (Cache HIT) ou enviá-lo de volta para o HAP no caso do Cache MISS, o HAP então seleciona um servidor PHP & recursos são obtidos a partir dele e servidos ao cliente pelo HAP através do Varnish. Eu tenho o seguinte arquivo de configuração. Não entendo 2 coisas aqui;

  1. no cache perca o verniz do cenário que solicita ao HAP que verifica o cookie de login do aplicativo, não o encontra e o envia de volta ao verniz (final menos a situação de loop), posso fazer o Varnish definir um cookie e fazer o HAP para verificar isso e selecionar servidores PHP backend nesta base (sugestões bem-vindas).
  2. Em segundo lugar, como posso conseguir isso quando os recursos são buscados pelo HAP no caso de MISS, ele envia para o verniz e, em seguida, é exibido ao cliente, assim o Varnish acumula o cache eventualmente.

Por favor, deixe-me saber se alguma coisa crítica é perdida aqui.

Obrigado antecipadamente

Arquivo de configuração

#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);
}
    
por APZ 08.01.2013 / 01:14

1 resposta

1

Graças a Baptiste Assmann eu consegui a resposta para o ponto 2 eu perguntei - Uma vez que o servidor PHP responde a HAProxy, então a resposta segue o caminho inverso, então a resposta passa pelo Varnish (então é armazenado em cache) e então retorna para HAProxy então o cliente.

Para o ponto 1, a condição de loop que mencionei (graças a Baptiste novamente) pode ser corrigida colocando uma ACL na configuração HAP que roteia o tráfego para servidores PHP (estou usando o IP do Varnish como condição), portanto, quando falta o cache acontece o HAP obtém o pedido do verniz, obtém os recursos e segue o caminho inverso e vai para o Varnish, depois para o HAP e, finalmente, para o usuário. Eu testei essa condição e os registros do HAP informam claramente que está funcionando:

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″

A chamada chega ao HAP e, como o cookie não está disponível, o HAP envia para o verniz, ocorre a falta do cache e o worker0 é usado para obter recursos pelo HAP. Na próxima chamada (estou cacheando por 1m) o Varnish serve tudo do cache (o varnishlog me disse isso) e os servidores PHP não são contatados.

Obrigado

    
por 08.01.2013 / 21:57