Varnish ESI 不工作

Varnish ESI 不工作

我有这样的配置: - nginx 端口 80 - varnish(3.0.4)端口 6081 - apache 端口 8080

Nginx 接收请求并将其传递给 Varnish,然后 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" /> 

date.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 尚未被处理。

我究竟做错了什么?

答案1

解决了...如果服务器响应的第一个字符不是“<”,ESI 将不起作用。我的问题的解决方案只是将测试文件包装在标准 HTML 结构中,使其看起来像这样:

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

答案2

另一种方法是使用参数运行 Varnish 守护程序:

-p esi_syntax 0x3

意思是

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

相关内容