Verniz ESI não funciona

Verniz ESI não funciona

Eu tenho uma configuração assim: - porta nginx 80 - verniz (3.0.4) porta 6081 - porta apache 8080

O Nginx pega a solicitação e a passa para o Varnish, que então verifica o cache e retorna a resposta do cache ou passa a solicitação para o Apache. No Apache, desabilitei o mod_deflate para que a saída não seja compactada. Dentro do Varnish eu habilitei o ESI para todas as solicitações como esta:

sub vcl_fetch {
    set beresp.do_esi = true;
}

E meu arquivo de teste (test.php) fica assim:

Current time is: <esi:include src="/date.php" /> 

A data.php:

<?php
echo date('H:i:s');

Mas o Varnish não está processando o ESI incluído. No vernizlog recebo este erro:

11 ESI_xmlerror c No ESI processing, first char not '<'

Cabeçalhos de resposta de test.php:

Accept-Ranges:bytes
Age:3
Connection:keep-alive
Content-Length:51
Content-Type:text/html
Date:Sun, 01 Sep 2013 11:51:57 GMT
Server:nginx
Surrogate-Control:"ESI/1.0"
Via:1.1 varnish
X-Powered-By:PHP/5.4.15-1~precise+1
X-Varnish:1236304062 1236304061

E a saída HTML:

Current time is: <esi:include src="/name.php" /> 

Então você pode ver que o ESI não é processado.

O que estou fazendo de errado?

Responder1

Resolvido... se o primeiro caractere da resposta do servidor não for "<" o ESI não funcionará. A solução para o meu problema foi apenas agrupar o arquivo de teste na estrutura HTML padrão, para que ficasse assim:

<html>
<head>
    <title></title>
</head>
<body>
Current time is: <esi:include src="/name.php" /> 
</body>
</html>

Responder2

Outra maneira é executar o daemon Varnish com o parâmetro:

-p esi_syntax 0x3

que significa

0x00000001 - Don't check if it looks like XML
0x00000002 - Ignore non-esi elements

informação relacionada