2012-11-13 41 views
2

我有清漆ESI问题(边缘端包含)奇怪的字符:有时它采用ESI的部分显示奇怪的字符,比如像下面的那些:光油ESI:

The part with ESI sometimes displays strange characters

如何我能解决这个问题吗?有趣的是,有时候会出现这个问题,但有时候不会。

+0

此bug已也固定在清漆3.0.3 [清漆缓存3.0.3](HTTPS: //www.varnish-cache.org/releases/varnish-cache-3.0.3) – kjszymanski

回答

3

这看起来像清漆gzip的一个奇怪的错误。如果你获得了压缩块通过ESI并且它不在缓存中(MISS),你会得到这个奇怪的符号。如果你从缓存中得到这个块,一切都可以。解决的办法是禁用的gzip用于内部路由:

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

.....

+0

救了我这个:) – Layke

0

看起来你有双重压缩ESI内容

0

This chapter解释光油如何ESI加工过程中的工作用gzip。我真的很喜欢这句话:

从理论上讲,希望在实践中,你在上面所读到的所有内容在启用ESI时都应该适用,如果不是,那么它就是你应该报告的错误。

长话短说,Varnish的工作原理:在第一次请求页面时(缓存未命中),一个页面直接从网页服务器通过Varnish渲染。之后 - 页面被放入缓存存储,因此下一个请求将从存储中加载(缓存命中)。

不知何故,第一请求页面中呈现ungzipped,但被放入存储gzip压缩。这是发生错误的地方。由于nginx总是尝试gzip内容,因此我们在ungzip页面中将gzip包括(ESI期间)。

这种行为在提到文档章节解释说:

查找过程中,我们忽略任何“接受编码”中的对象有所不同:字符串,以避免一个gzip和gunzip'ed对象的版本,清漆可根据需要进行枪支压制。 (我们落实查找时间这一点魔法,使存储在持久存储任何对象可以有或无gzip的支持,使使用。)

所以,这个问题就可以“解决”有一种秒杀 - 通过迫使光油ESI处理期间总是发送ungzipped含量(因为它是在由one of the answers提到klipach):

# www.vcl 

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

     return(lookup); 
    } 
    # ... 
}