Documentação do Symfony2
Renderizada do repositório symfony-docs-pt-BR no Github

Como usar Varnish para aumentar a velocidade do meu Website

Pelo cache do Symfony2 usar os cache headers padrões do HTTP, o Proxy Reverso do Symfony2 pode facilmente se substituido por qualquer por qualquer outro proxy reverso. Varnish é um poderoso, open-source, HTTP accelerator capaz de servir conteúdo em cache de forma rápida em incluindo suporte à Edge Side Includes (ESI).

Configuração

Como visto anteriormente, Symfony2 é esperto o bastente para detectar se fala com um proxy reverso que compreende ESI ou não. Ele trabalha fora da caixa quando você usa o proxy reverso do Symfony2, mas você precisa de um configuração especial para poder trabalhar com Varnish. Felizmente, Symfony2 depende ainda de outro padrão escrito por Akamaï (Edge Architecture), então as dicas de configuração desde capítulo podem ser úteis mesmo se você não usar Symfony2.

Note

Varnish suporta apenas o atributo src para tags ESI (atributos onerror e alt são ignorados).

Primeiro, configure o Varnish para que ele informe o suporte à ESI adicionando um Surrogate-Capability ao cabeçalho nas requisições enviadas ao servidor de aplicação:

sub vcl_recv {
    set req.http.Surrogate-Capability = "abc=ESI/1.0";
}

Após isso, otimize o Varnish para que ele apenas analise o conteúdo da resposta quando existir ao menos uma tag ESI, verificando o cabeçalho Surrogate-Control que é adicionado automaticamente pelo Symfony2.

sub vcl_fetch {
    if (beresp.http.Surrogate-Control ~ "ESI/1.0") {
        unset beresp.http.Surrogate-Control;

        // para Varnish >= 3.0
        set beresp.do_esi = true;
        // para Varnish < 3.0
        // esi;
    }
}

Caution

Compressão com ESI não é suportada pelo Varnish até a versão 3.0 (leia GZIP and Varnish). Se você não está utilizando Varnish 3.0, coloque um servidor web a frente do Varnish para executar a compressão.

Invalidação do Cache

Você nunca deverá precisar invalidar os dados em cache porque a invalidação é colocada nativamente nos modelos de cache HTTP (veja Invalidação do Cache).

Ainda assim, o Varnish pode ser configurado para aceitar um método HTTP PURGE especial que invalidará o cache para derterminado recurso:

sub vcl_hit {
    if (req.request == "PURGE") {
        set obj.ttl = 0s;
        error 200 "Purgado";
    }
}

sub vcl_miss {
    if (req.request == "PURGE") {
        error 404 "Não Purgado";
    }
}

Caution

Você deve proteger o método HTTP``PURGE`` para evitar que qualquer pessoa possa purgar os dados em cache.