Лак: Создание каждого кеширования ключей API-объектов отдельно - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть установка 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 Ответ

0 голосов
/ 19 февраля 2019

Это легко.Поскольку вы хотите, чтобы размер кэша варьировался в зависимости от конкретного заголовка, вы должны сообщить об этом Varnish.Так что либо сделайте так, чтобы ваш сервер отправлял Vary: X-Api-Key (лучший маршрут), либо добавьте Varnish hash в значение этого заголовка:

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