我有以下配置:
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?
答案 0 :(得分:3)
如果您有软件网关缓存/反向代理(如Varnish),则无需启用AppCache
(这是用PHP编写的Symfony2反向代理)。
允许AppCache
启用会导致不一致的行为,因为您将拥有2个反向代理。