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

Лак ESI не работает

У меня такая конфигурация: - порт 80 nginx - порт 6081 varnish (3.0.4) - порт 8080 apache

Nginx принимает запрос и передает его Varnish, который затем проверяет кеш, а затем либо возвращает ответ из кеша, либо передает запрос Apache. В Apache я отключил mod_deflate, поэтому вывод не архивируется. Внутри Varnish я включил ESI для всех таких запросов:

sub vcl_fetch {
    set beresp.do_esi = true;
}

А мой тестовый файл (test.php) выглядит так:

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

Дата.php:

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

Но Varnish не обрабатывает ESI. В журнале varnishlog я получаю такую ​​ошибку:

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

Заголовки ответа от 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

И вывод html:

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

Итак, вы можете видеть, что ESI не обрабатывается.

Что я делаю не так?

Решено ... если первый символ ответа сервера не "<" ESI не будет работать .. Решением моей проблемы было просто обернуть тестовый файл в стандартную структуру HTML, чтобы он выглядел так:

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

Другой способ - запустить демон Varnish с параметром:

-p esi_syntax 0x3

что значит

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