Лак: Создание каждого кеширования ключей API-объектов отдельно
У меня есть установка 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();
}
}
Однако объекты, извлеченные из бэкэнда PROD, могут доставляться в запросы к бэкенду TEST, если срок их действия не истек, и наоборот.
Как сделать так, чтобы контент каждого бэкэнда был изолирован от другого?
1 ответ
Решение
Это легко. Поскольку вы хотите, чтобы размер кэша варьировался в зависимости от конкретного заголовка, вы должны сообщить об этом Varnish. Так что либо сделайте свой бэкэнд отправьте Vary: X-Api-Key
(лучший маршрут), или есть лак hash
на значение этого заголовка:
sub vcl_hash {
if (req.http.X-Api-Key) {
hash_data(req.http.X-Api-Key);
}
}