如何通过IP使用Varnish 4.x缓存ESI片段和相应的输出

时间:2014-10-27 20:45:37

标签: caching varnish varnish-vcl esi

我正在尝试使用Varnish 4.x中的ESI从我的(PHP)后端获取数据。我想将结果保存(缓存)到我的Varnish实例中。结果对于每个IP地址(client.ip)都是唯一的,因此缓存结果的哈希必须使用client.ip构建。 Varnish没有按预期缓存。我似乎无法基于IP缓存。为了让您了解我尝试过的内容,请参阅下文。

unique.js:

var rand = '<esi:include src="/unique.php"/>';

unique.php:

<?php echo rand(); ?>

default.vcl(extract):

sub vcl_recv {
     if (req.url ~ "^/unique.(js|php)") {
         set req.http.marker = client.ip;
     }
}

sub vcl_hash {
     if (req.http.marker) {
         hash_data(req.http.marker);
     }
}

sub vcl_backend_response {
    if (bereq.url == "/unique.js") {
       set beresp.do_esi = true;
       set beresp.ttl = 24h;
    } elseif (bereq.url == "/unique.php") {
       set beresp.ttl = 30d;
    }
}

显然我错过了一些东西。任何提示都表示赞赏!

1 个答案:

答案 0 :(得分:0)

我认为帖子中没有足够的信息可以给你一个明确的答案,但我的猜测是,由于与你的ESI代码无关的原因,缓存无法正常工作。

如多个地方(here is one example)所述,默认情况下,Varnish不会使用Cookie进行缓存。所以很可能是在JS或PHP会话代码中设置的cookie导致您的请求不被缓存。我的猜测是你需要添加:

unset req.http.cookie;

if (req.url ~ "^/unique.(js|php)") {区块内。