1

假设我有一个“资源” - http://localhost/doc,我希望它会一直被 Varnish 缓存,因为它经常被访问,除非有人通过 POST 更新它,在 POST 更新完成后,所有进一步的请求都应该检索最新版本的“博士”。

我的想法是将这个逻辑包装在我的后端服务器中,因为 POST 请求默认情况下将通过 Varnish 而不进行缓存,并且在我的后端服务器中我可以:

  1. 执行命令:varnishadm -T 127.0.0.1:6082 purge req.url == "/doc"
  2. 触发 HTTP 清除请求:curl -X PURGE http://localhost/doc

但是,它需要我配置 VCL 来尊重“ Cache-Control”标题!我的 VCL 如下所示,但不起作用:

sub vcl_fetch {
    if (beresp.http.Cache-Control ~ "no-cache") {
        purge;
    }
    return (deliver);
}
acl purgers { "127.0.0.1"; }

sub vcl_recv {
    if (req.request == "PURGE") {
        if (!client.ip ~ purgers) {
            error 405 "Method not allowed";
        }
        return (lookup);
    }
}
sub vcl_hit {
    if (req.request == "PURGE") {
        #purge;
        purge("req.url ~ " req.url); 
        error 200 "Purged";
    }
}
sub vcl_miss {
    if (req.request == "PURGE") { 
        purge;
        error 200 "Purged";
    }
}
sub vcl_pass {
    if (req.request == "PURGE") {
        error 502 "PURGE on a passed object";
    }
}

它投诉:

Message from VCC-compiler:
Expected ';' got '('

(program line 174), at
('input' Line 154 Pos 14)
        purge("req.url ~ " req.url); 
-------------#-----------------------

Running VCC-compiler failed, exit 1

VCL compilation failed
  • 问题1:如何更新VCL以实现我的目标?
  • 问题2:我认为这是一个非常常见的场景:缓存资源同时保持最新,那么使用Varnish实现这一目标的最佳实践是什么?

感谢您的任何回复!

4

1 回答 1

0

当文档更新时,您的应用程序服务器可以请求清除 url。它需要为文档发送 PURGE 请求而不是 GET 请求。

或者,当您收到该 url 的 POST 时,您可以对该 url 发出禁令。

于 2014-07-23T07:58:20.257 回答