4

我有以下配置:

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

(使用 Apache 和 mod_php 的行为相同)我的 Varnish 配置:

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-maxage 60 并具有 esi-include for /esiinner(使用“普通”esi-tag 或 twig-render 函数{'standalone': true}):<esi:include src="/esiinner" />
  • /esiinner使用 s-maxage 10(由 esi-include 获取)

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

为什么 Varnish 发送分块响应并且不缓冲 esi 块并将页面作为一个整体发送?如果我在带有 ESI 的 Symfony 应用程序前面使用 Varnish,我是否必须使用 Symfonys AppCache?

4

1 回答 1

3

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

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

于 2013-05-03T14:00:03.900 回答