清漆:使每个API密钥对象分别缓存

时间:2019-02-18 12:42:50

标签: varnish varnish-vcl varnish-4

我安装了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后端的请求中,反之亦然。

如何确保每个后端的内容彼此隔离?

1 个答案:

答案 0 :(得分:2)

这很容易。由于您希望缓存根据特定的标头而有所不同,因此应将其告知Varnish。因此,要么让后端发送Vary: X-Api-Key(最佳路由),要么在该标头的值上添加清漆hash

sub vcl_hash {
    if (req.http.X-Api-Key) {
        hash_data(req.http.X-Api-Key);
    }
}