我安装了Varnish 4,在其中我根据每个请求的标头中的API密钥选择一个后端,例如(我们在vcl_recv中):
if (req.url ~ "/content") {
# Check for presence of X-Api-Key header
if ((! req.http.X-Api-Key) || ((! req.http.X-Api-Key ~ "prod-") && (! req.http.X-Api-Key ~ "test-"))) {
return(synth(403,"Access Denied - API key missing or invalid."));
}
if (req.http.X-Api-Key ~ "prod-") {
set req.backend_hint = PROD.backend();
}
if (req.http.X-Api-Key ~ "test-") {
set req.backend_hint = TEST.backend();
}
}
但是,如果TTL尚未过期,则从PROD后端获取的对象可以传递到对TEST后端的请求中,反之亦然。
如何确保每个后端的内容彼此隔离?
答案 0 :(得分:2)
这很容易。由于您希望缓存根据特定的标头而有所不同,因此应将其告知Varnish。因此,要么让后端发送Vary: X-Api-Key
(最佳路由),要么在该标头的值上添加清漆hash
:
sub vcl_hash {
if (req.http.X-Api-Key) {
hash_data(req.http.X-Api-Key);
}
}