2011-12-12 59 views
4

我有以下配置:Symfony2中,上光油和ESI導致奇怪的行爲

varnish (80) <-> nginx (8080) <-> php-fpm (9000) 

我光油配置(使用Apache與mod_php的相同行爲):

backend default { 
    .host = "127.0.0.1"; 
    .port = "8080"; 
    .connect_timeout = 600s; 
    .first_byte_timeout = 600s; 
    .between_bytes_timeout = 600s; 
} 

sub vcl_recv { 
    set req.http.Surrogate-Capability = "abc=ESI/1.0"; 
} 


sub vcl_fetch {  
    if (beresp.http.Surrogate-Control ~ "ESI/1.0") { 
     unset beresp.http.Surrogate-Control; 
     set beresp.do_esi = true; 
    } 
} 

sub vcl_deliver { 
    if (obj.hits > 0) { 
     set resp.http.X-Varnish-Cache = "HIT Varnish (" +obj.hits+ ")"; 
    } else { 
     set resp.http.X-Varnish-Cache = "MISS"; 
    } 
} 

ESI在開啓app/config/config.yml。我配置在symfony的以下路線:

  • /esiouter與S-最大生存週期60和具有ESI-包括用於/esiinner(使用 「普通」 ESI-標籤或樹枝渲染與{'standalone': true}功能):<esi:include src="/esiinner" />
  • /esiinner與S-最大生存週期10

現在(由ESI-包括提取),當我在web/app.php symfony中啓用應用程序緩存評估ESI標籤,使清漆沒有得到他們,我們有一個Content-Length標題和內容是不是分塊。如果我禁用AppCache,varnish會評估ESI標籤併發送分塊內容,並且沒有標頭。

爲什麼Varnish發送一個分塊響應並且不會緩衝esi-blocks並將頁面作爲一個整體發送? 如果我正在Symfony-Application的ESI中使用Varnish,我必須使用Symfonys AppCache嗎?

+1

如果您自己沒有解決問題,我希望今天晚些時候有時間進行調查。我至少可以告訴你,你不應該使用AppCache,因爲它基本上是Varnish的替代品。 –

回答

3

如果您有軟件網關緩存/反向代理(如Varnish),則不需要啓用AppCache(這是用PHP編寫的Symfony2反向代理)。

啓用AppCache可能會導致不一致的行爲,因爲您將有2個反向代理。

+0

錯誤的是,[關於緩存的Symfony文檔](http://symfony.com/doc/2.3/book/http_cache.html#symfony-reverse-proxy)指出:[...]好消息是從一個代理服務器切換到另一個代理服務器很容易和透明,因爲您的應用程序不需要修改代碼。[...]。但是刪除'app.php'中的'AppCache'是一個修改。也許這是挑剔的,但我想確保'AppCache'確實只是Symfony的反向代理,而不是其他。 – flu