清漆:有条件地清除缓存以确保资源是最新的

时间:2013-01-09 06:15:04

标签: varnish varnish-vcl

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

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

  1. 执行命令:varnishadm -T 127.0.0.1:6082 purge req.url == "/doc"
  2. 触发HTTP清除请求:curl -X PURGE http://localhost/doc
  3. 但是,我需要配置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:我 认为这是一个非常常见的场景:缓存资源,同时保留它 到目前为止,实现此目的的最佳实践是什么 清漆?

    感谢您的回复!

1 个答案:

答案 0 :(得分:0)

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

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