Varnish с несколькими сайтами и несколькими IP-адресами

Я пытаюсь запустить Varnish для двух доменов, каждый из которых находится на разных IP-адресах, и настроен на свой собственный файл .VCL. Мне удалось написать все файлы конфигурации, чтобы Varnish прослушивал каждый IP; так что Apache будет слушать Varnish на двух портах. Все выглядит прекрасно, НО! Когда я загружаю первый домен в браузер, он перенаправляет (302) на второй домен. Моя предыдущая установка работала в качестве первого домена для работы без Varnish и второго домена с Varnish. Может ли кто-нибудь предложить решение или подход к отладке. 10x


person user2047710    schedule 20.01.2017    source источник
comment
Похоже, вы слишком все усложняете. Зачем настраивать Varnish для прослушивания разных IP-адресов? Вам нужно два определения бэкэнда в Varnish (не для прослушивания) для каждого IP-адреса вашего бэкэнд-сервера. Если вы получаете перенаправление, похоже, что все находится на одном сервере: D, тогда просто настройте один бэкэнд 127.0.0.1 и выполните условное включение VCL на основе значения переменной хоста HTTP getpagespeed.com/server-setup/varnish/varnish-virtual-hosts   -  person Danila Vershinin    schedule 21.01.2017
comment
Два IP специально! Под условным включением VCL вы имеете в виду размещение Ifs (req.http.host) в каждом подразделе с использованием одного файла .vcl? Это усложняет ситуацию, поскольку каждый домен использует разные правила в WordPress. Первый домен имеет логин и формы js, которые плохо работают под Varnish, поэтому я стараюсь сохранить два разных .vcl, чтобы упростить настройку и отладку. При наличии трех доменов один .vlc-default будет еще сложнее. У меня уже есть два бэкенда, прослушивающих каждый IP, но один перенаправляет на второй.   -  person user2047710    schedule 21.01.2017
comment
В более ранних версиях Varnish на CentoS было намного проще выполнить ту же настройку. Теперь я пытаюсь сделать то же самое с Varnish 4 на Debian и сталкиваюсь с несколькими неправильными представлениями. Должен ли я запускать второй экземпляр лака для второго домена???   -  person user2047710    schedule 21.01.2017
comment
Похоже, вы вообще не читали статью. Под условным включением VCL я подразумеваю размещение ifs в ОТДЕЛЬНОМ файле для каждого домена. Это очень элегантно и просто, если вы попытаетесь понять, как это делается и как включение VCL работает в Varnish.   -  person Danila Vershinin    schedule 22.01.2017
comment
@ДэниелВ. Спасибо за ссылку. Я просмотрела его. Сейчас перечитал еще несколько раз. Во-первых, это ошибка, потому что вы не добавляете подпрограммы в файлы .conf. Однако, возможно, это не имеет значения, когда это делается через include. Во-вторых, возникает главный вопрос. Так как Varnish выполняет все подпрограммы по порядку, как включенные файлы .vcl для каждого домена в конце главного файла vcl, их подпрограммы будут выполняться после, например, sub vcl_hit, в заголовке vcl?   -  person user2047710    schedule 04.02.2017
comment
В любом случае, я разгадал загадку пересылки и нашел несколько методов отладки.   -  person user2047710    schedule 04.02.2017


Ответы (1)


У меня эта установка работает без проблем. Я использую один файл vcl (логика на обоих сайтах/бэкэндах почти одинакова). Сервер имеет несколько IP-адресов, Apache использует их все и обслуживает разные сайты на разных IP-адресах. На некоторых IP-адресах также есть виртуальные хосты.

Во-первых, проверьте, действительна ли ваша установка Apache и нет ли перенаправлений.

curl -I -L http://hostname1.com

Во-вторых, в вашем vcl определите бэкэнды (первый пример, если бэкенд1 является виртуальным хостом, пример2, если бэкэнд2 не является виртуальным хостом и доступен по этому ip)

backend backend1 {
    .host = "127.0.0.1";
    .port = "81";
    .host_header = "hostname1.com";
}

backend backend2 {
  .host = "192.168.1.1";
  .port = "80";
}

В-третьих, в вашем vcl_recv у вас будет что-то вроде этого:

  if (req.http.host ~ "^(www\.)?hostname1\.com$") {
    set req.http.host = "hostname1.com";
    set req.backend_hint = backend1;

  }
  elseif (req.http.host ~ "^(www\.)?hostname2\.com$") {
    set req.http.host = "hostname2.com";
    set req.backend_hint = backend2;
  }

Вот и все.

person seven    schedule 13.02.2017