2012-11-13 45 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); 
    } 
    # ... 
}