我使用varnish 4.0.3作为反向代理缓存和负载均衡器
我希望避免对以/api/v1/
开头的链接或其链接中包含feed
的任何链接进行清除缓存,并直接从后端服务器提供请求。
我这样做了:
sub vcl_recv { if ((req.url ~ "^/api/v1/" || req.url ~ "feed") && req.http.host ~ "api.example.com") { set req.backend_hint = apis.backend(); }
但是基于访问日志,它提供来自Backend的第一个请求,然后它直接提供来自varnish的新请求!我做错了什么?或者还有什么我需要做的吗?
答案 0 :(得分:1)
应该是:
sub vcl_recv {
if ((req.url ~ "^/api/v1/" || req.url ~ "feed")
&& req.http.host == "api.example.com") {
return (pass);
}
}
return (pass)
会将Varnish切换为匹配请求的传递模式。在传递模式下,Varnish既不会将结果放入缓存,也不会从缓存中传递(总是与后端进行对话)。
某种类型的微优化使用req.http.host
运算符匹配==
。在这种情况下,不需要正则表达式匹配。