为什么使用Varnish在ESI片段上获得503服务不可用



我已经在本地设置了Varnish,并在页面的特定区域实现了ESI片段;但是,一旦我在default.vcl上打开ESI,varnish就会停止缓存,更重要的是,添加片段的页面的特定部分会显示503服务不可用的通知。

似乎使清漆停止缓存的那一行是这里的另一句话:

if (req.url ~ ".(png|gif|jpg|swf|css|js)$") {
unset beresp.http.set-cookie;
set beresp.ttl = 20m;
}
else {
set beresp.do_esi = true;
}

这是我的默认.vcl:http://pastebin.com/MEQF4Gbk

现在,在RxHeaders中,我得到了很多"ESI_xmlerror c No ESI processing,first char not'<'">

这里是RxHeader之一的示例(用于JS文件)http://pastebin.com/tX7zpBN1

我想,我不明白该如何告诉清漆只有当它有esi碎片时才能缓存?有人能解释一下我做错了什么吗?

您的vcl被设置为不仅对包含esi的页面,而且对esi片段本身进行esi处理,而后者失败,导致503s而不是您想要的片段。如果你不想递归地将片段处理为esi容器本身,你可以将你的VCL更改为:

if (req.url ~ ".(png|gif|jpg|swf|css|js)$") {
unset beresp.http.set-cookie;
set beresp.ttl = 20m;
}
else if (req.esi_level == 0 ) {
set beresp.do_esi = true;
}

如果您确实想将这些包含处理为esi容器本身,请确保它们以尖括号<开头(varnish 2默认为仅对html/xml执行esi)。如果这不可能,您可以通过在启动varnishd:时设置此参数来配置varnishd:

esi_syntax=0×1

如果我是你,我会专门为可以包含esi:includes的资源启用esi,而不是像你这样为选定的内容类型禁用它。这样,你就不需要在VCL中维护一个可能会更改的列表,而且不包含esi的资源也不会浪费清漆扫描它们的时间。您可以基于后端的响应标头(如X-Varnish-do-Esi)来执行此操作,并且只为包含include的资源发送该响应标头。

最新更新