首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Varnish ESI:陌生字符

Varnish ESI:陌生字符
EN

Stack Overflow用户
提问于 2012-11-14 00:17:22
回答 3查看 670关注 0票数 2

我在使用Varnish ESI (Edge Side Includes)时遇到了一个问题:有时使用ESI的部分会显示奇怪的字符,如下图所示:

我该如何解决这个问题呢?有趣的是,这个问题有时会发生,但有时不会。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-26 19:49:50

这看起来像是Varnish中gzip的一个奇怪的bug。如果你通过ESI得到this块,并且它不在缓存中(未命中),你会得到这个奇怪的符号。如果你从缓存中得到这个块,一切都是正常的。解决方案是禁用内部路由的gzip:

代码语言:javascript
复制
if (req.url ~ "/_internal") {
    # Telling ESI that we do not support gzip
    remove req.http.Accept-Encoding;

.

票数 3
EN

Stack Overflow用户

发布于 2012-11-16 01:52:21

看起来你有双倍压缩的ESI内容

票数 0
EN

Stack Overflow用户

发布于 2012-11-28 19:15:22

This chapter解释了在ESI处理过程中Varnish如何与gzip一起工作。我真的喜欢这句话:

在理论上,希望在实践中,当你启用

时,你上面读到的所有内容也应该适用,如果不是,你应该报告它是一个错误。

长话短说,Varnish是如何工作的:在对页面的第一次请求(缓存未命中)期间,Varnish直接从web服务器呈现页面。在此之后- page被放入缓存存储,因此对于下一个请求,它将从存储中加载(缓存命中)。

不知何故,在第一次请求时,页面被渲染为未压缩的,但被放入存储gzipped的中。这就是bug发生的地方。因为nginx总是尝试用gzip压缩内容,所以我们在未压缩的页面中使用了gzip包含(在ESI期间)。

在提到的文档章节中解释了这种行为:

在查找过程中,我们忽略了对象变量中的任何“接受编码”:字符串,为了避免对象的gzip和gunzip版本,varnish可以按需进行gunzip。(我们在查找时实现了这个魔术,这样存储在持久性存储中的任何对象都可以在启用或不启用gzip支持的情况下使用。)

因此,这个问题可以通过某种尖峰来“解决”-通过强制Varnish在ESI处理期间总是发送未压缩的内容(正如klipachone of the answers中提到的那样):

代码语言:javascript
复制
# www.vcl

sub vcl_recv {
    # ...
    if (req.url ~ "/_internal") {
        # Telling ESI that we do not support gzip
        remove req.http.Accept-Encoding;

        return(lookup);
    }
    # ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13364410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档