清漆:使每个 API 键 objects 单独缓存
Varnish: Making each API keys objects cache separately
我安装了 Varnish 4,其中我 select 基于每个请求的 header 中的 API-key 的后端,例如(我们在 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 后端获取的 objects 可以传送到对 TEST 后端的请求,反之亦然。
如何确保每个后端的内容相互隔离?
这个很简单。由于您希望缓存因特定 header 而异,您应该将其告知 Varnish。因此,要么让您的后端发送 Vary: X-Api-Key
(最佳路线),要么在 header 的值上使用 Varnish hash
:
sub vcl_hash {
if (req.http.X-Api-Key) {
hash_data(req.http.X-Api-Key);
}
}
我安装了 Varnish 4,其中我 select 基于每个请求的 header 中的 API-key 的后端,例如(我们在 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 后端获取的 objects 可以传送到对 TEST 后端的请求,反之亦然。
如何确保每个后端的内容相互隔离?
这个很简单。由于您希望缓存因特定 header 而异,您应该将其告知 Varnish。因此,要么让您的后端发送 Vary: X-Api-Key
(最佳路线),要么在 header 的值上使用 Varnish hash
:
sub vcl_hash {
if (req.http.X-Api-Key) {
hash_data(req.http.X-Api-Key);
}
}