Обслуживание нескольких сайтов из лака

У меня есть несколько сайтов, которые я хочу кэшировать с помощью одного и того же экземпляра лака.

Я настроил бэкэнд, используя что-то вроде:

if (req.http.host == "time.ikub.al") {
    # Process through time backend
    set req.backend_hint = timeserver;
}

if (req.http.host == "m.time.ikub.al") {
    # Process through time mobile backend
    set req.backend_hint = timemobileserver;
}

и хэш-метод выглядит так:

sub vcl_hash {
    # Called after vcl_recv to create a hash value for the request. This is used as a key
    # to look up the object in Varnish.
    hash_data(req.url);
    if (req.http.host) {
       hash_data(req.http.host);
    } else {
       hash_data(server.ip);
    }
    # hash cookies for requests that have them
    if (req.http.Cookie) {
        hash_data(req.http.Cookie);
    }
}

Однако я заметил, что страницы из мобильной версии обслуживаются на десктопе и наоборот. Это произошло на страницах с одинаковым именем, например «Default.aspx».

Насколько я понимаю код выше, хэш должен включать хостовую часть, а этого не должно происходить. Я что-то упустил, или есть какие-то рекомендации по работе с несколькими сайтами?

Спасибо, Альберт


person Albert    schedule 24.05.2016    source источник


Ответы (3)


Я думаю, что вы частично скопировали vcl по умолчанию, но забыли return (lookup);, поэтому после выполнения вашего кода лак выполняет код по умолчанию, и это может привести к неправильному поведению лака.

документация Varnish vcl_hash

person Redithion    schedule 02.08.2016
comment
В предоставленной вами ссылке говорится: Будьте осторожны при вызове return (lookup), так как это прервет выполнение VCL по умолчанию, и Varnish может в конечном итоге вернуть данные на основе более или менее случайных входных данных. Кажется, я не должен вызывать return (поиск), верно? - person Albert; 12.08.2016
comment
Это зависит от того, я часто пишу весь vcl_hash (включая код по умолчанию, если он мне нужен) и вызываю return (lookup);, чтобы убедиться, что делает мой метод - person Redithion; 12.08.2016
comment
@Albert Альберт, я думаю, вам следует зарегистрировать req.http_host в vcl_hash, возможно, проблема в нем. - person Redithion; 16.08.2016
comment
Я зарегистрировал req.http.host, и все выглядит нормально ... до сих пор не могу найти логического ответа. - person Albert; 08.09.2016
comment
У меня сложилось впечатление, что перенаправления не были кэшированы ... однако кажется, что перенаправления кэшируются, и происходит то, что ответ перенаправления из настольной версии кэшируется, а следующему клиенту обслуживается кэшированная страница, поэтому он перенаправляет его на мобильную версию. .. Я переместил логику перенаправления на сторону клиента, и все, кажется, работает - person Albert; 09.09.2016

Спрятан ли ваш экземпляр лака за каким-либо другим обратным прокси-сервером, балансировщиком нагрузки, разгрузчиком https или чем-то подобным?

Возможно, любой передний уровень может исказить заголовок узла, поэтому этот код не будет выполнять ни первое, ни второе условие:

# unset req.http.host or set req.http.host = "my.varnish.backend";

if (req.http.host == "time.ikub.al") {
    # Process through time backend
    set req.backend_hint = timeserver;
}

if (req.http.host == "m.time.ikub.al") {
    # Process through time mobile backend
    set req.backend_hint = timemobileserver;
}

Таким образом, req.backend_hint не вступает в силу, и лак может выбирать серверную часть недетерминированным образом. По крайней мере, бэкэнд по умолчанию был другим после различных перезапусков и перезагрузки для меня.

Просто попробуйте проверить этот путь, может быть, это поможет.

person Rastislav Kassak    schedule 08.08.2016

У меня сложилось впечатление, что «перенаправления» не были кэшированы ... однако кажется, что перенаправления кэшируются, и происходит то, что ответ перенаправления из настольной версии кэшируется, а следующему клиенту обслуживается кэшированная страница, поэтому он перенаправляет его на мобильный версия... Я переместил логику перенаправления на сторону клиента, и все, кажется, работает

person Albert    schedule 09.09.2016