0

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

似乎使清漆停止缓存的行是这里的 else 语句:

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

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

现在,在 RxHeaders 我得到很多“ESI_xmlerror c No ESI processing, first char not '<'”

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

我想,我不明白如何告诉清漆只有在它有 esi 片段时才缓存?有人可以解释我做错了什么吗?

4

1 回答 1

0

您的 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 时设置此参数来配置 varnish 不关心:

esi_syntax=0×1

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

于 2013-07-17T19:44:03.137 回答