Symfony2,Varnish和ESI导致奇怪的行为

时间:2011-12-12 10:36:57

标签: symfony varnish 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";
    }
}

app/config/config.yml中启用了ESI。我在symfony中配置了以下路由:

  • /esiouter,其中s-maxage为60,并且/esiinner具有esi-include(使用“普通”esi-tag或twig-render函数与{'standalone': true}):{{1} }
  • <esi:include src="/esiinner" /> s-maxage 10(由esi-include提取)

现在,当我在/esiinner中启用AppCache时,symfony会对ESI标记进行评估,因此varnish不会获取它们,并且我们有一个web/app.php标头,内容不会被分块。如果我禁用AppCache,varnish将评估ESI标记并发送chunked内容,并且没有Content-Length标题。

为什么Varnish发送了一个分块响应并且没有缓冲esi-blocks并整个发送页面? 如果我使用ESI的Symfony-Application使用Varnish,我是否必须使用Symfonys AppCache?

1 个答案:

答案 0 :(得分:3)

如果您有软件网关缓存/反向代理(如Varnish),则无需启用AppCache(这是用PHP编写的Symfony2反向代理)。

允许AppCache启用会导致不一致的行为,因为您将拥有2个反向代理。