假设我有一个“资源” - http://localhost/doc
,我希望它会一直被 Varnish 缓存,因为它经常被访问,除非有人通过 POST 更新它,在 POST 更新完成后,所有进一步的请求都应该检索最新版本的“博士”。
我的想法是将这个逻辑包装在我的后端服务器中,因为 POST 请求默认情况下将通过 Varnish 而不进行缓存,并且在我的后端服务器中我可以:
- 执行命令:
varnishadm -T 127.0.0.1:6082 purge req.url == "/doc"
- 触发 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实现这一目标的最佳实践是什么?
感谢您的任何回复!