【问题标题】:Why do I get a 503 Service Unavailable on an ESI Fragment using Varnish?为什么我在使用 Varnish 的 ESI 片段上得到 503 服务不可用?
【发布时间】:2012-11-08 01:50:12
【问题描述】:

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

似乎使 varnish 停止缓存的那一行是这里的 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 片段时才缓存?有人可以解释我做错了什么吗?

【问题讨论】:

标签: drupal caching varnish esi


【解决方案1】:

您的 vcl 设置为不仅对包含 esi 的页面进行 esi 处理,而且对 esi 片段本身进行处理,后者失败导致 503s 而不是您想要的 sn-p。如果您不想将片段作为 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 等后端的响应标头来执行此操作,并且只为包含包含的资源发送该响应标头。

【讨论】:

    猜你喜欢
    • 2014-05-01
    • 2020-03-24
    • 2011-10-27
    • 1970-01-01
    • 2015-08-29
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多