假设我有一个“资源” - http://localhost/doc
,我希望它一直被 Varnish 缓存 因为它经常被访问, 除了 有人通过 POST 更新它,POST 更新完成后,所有进一步的请求都应该检索最新版本的“文档”。
我的想法是将此逻辑包装在我的后端服务器中,因为默认情况下 POST 请求将通过 Varnish 而不进行缓存,而在我的后端服务器中,我可以:
varnishadm -T 127.0.0.1:6082 purge req.url == "/doc"
curl -X PURGE http://localhost/doc
但是,它需要我配置 VCL 以支持“
Cache-Control
” header !我的 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
认为这是一个很常见的场景:缓存资源同时保留它
最新的,那么使用实现这一目标的最佳实践是什么
漆?
感谢您的任何回应!
最佳答案
当文档更新时,您的应用程序服务器可以发出清除URL的请求。它需要为文档发送PURGE请求,而不是GET请求。
另外,当您收到该网址的POST时,可以对该网址发布禁令。
关于 Varnish :有条件地清除缓存以确保资源是最新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14229301/