Spec-Zone.ru › Varnish

Файлы VCL для разных доменов

Использование нескольких виртуальных хостов (vhosts) в одном Varnish — очень распространённый сценарий. Начиная с Varnish 5.0, можно использовать отдельные файлы VCL для разных виртуальных хостов или других различных подмножеств запросов.

Предположим, что мы хотим обрабатывать varnish.org с помощью одного файла VCL и varnish-cache.org с помощью другого файла VCL.

Сначала загрузим два файла VCL:

vcl.load vo_1 /somewhere/vo.vcl
vcl.load vc_1 /somewhere/vc.vcl

Это стандартные файлы VCL, как если бы вы работали только с одним доменом на вашем экземпляре Varnish.

Далее необходимо указать метки VCL для них:

vcl.label l_vo vo_1
vcl.label l_vc vc_1

Затем напишем программу VCL верхнего уровня, которая будет перенаправлять запросы к другим файлам VCL в зависимости от заголовка Host в запросе:

import std;

# We have to have a backend, even if we do not use it
backend default { .host = "127.0.0.1"; }

sub vcl_recv {
    # Normalize host header
    set req.http.host = std.tolower(req.http.host);

    if (req.http.host ~ "\.?varnish\.org$") {
        return (vcl(l_vo));
    }
    if (req.http.host ~ "\.?varnish-cache\.org$") {
        return (vcl(l_vc));
    }
    return (synth(302, "http://varnish-cache.org"));
}

sub vcl_synth {
    if (resp.status == 301 || resp.status == 302) {
        set resp.http.location = resp.reason;
        set resp.reason = "Moved";
        return (deliver);
    }
}

Наконец, загрузим файл VCL верхнего уровня и сделаем его активным:

vcl.load top_1 /somewhere/top.vcl
vcl.use top_1

Если вы хотите обновить один из отдельных файлов VCL, загрузите новый файл и измените метку, чтобы она указывала на него:

vcl.load vo_2 /somewhere/vo.vcl
vcl.label l_vo vo_2

Если вы хотите изменить VCL верхнего уровня, сделайте это как обычно:

vcl.load top_2 /somewhere/top.vcl
vcl.use top_2

Подробности:

  • Все запросы всегда начинаются в активном файле VCL — том, который загружен в vcl.use
  • Только метки VCL могут использоваться в return(vcl(name)). Без этого ограничения файл VCL верхнего уровня пришлось бы перезагружать каждый раз, когда изменяется один из отдельных файлов VCL.
  • Вы можете переключаться между файлами VCL только из активного файла VCL. Если вы попытаетесь сделать это из одного из отдельных файлов VCL, получите код ошибки 503
  • Вы не можете удалять метки VCL (с помощью vcl.discard) если какой-либо файл VCL содержит return(vcl(name_of_that_label))
  • Вы не можете удалять файлы VCL, к которым привязана метка.
  • Этот код протестирован в тестовом случае c00077
  • Эта функция очень новая, она может измениться
  • Мы очень хотели бы получить обратную связь о том, как это работает для вас

Copyright © 2006 Verdens Gang AS
Copyright © 2006–2020 Varnish Software AS
Licensed under the BSD-2-Clause License.
https://varnish-cache.org/docs/7.4/users-guide/vcl-separate.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API