Назад | Перейти на главную страницу

Конфигурация Varnish, NamevirtualHosts и IP Forwarding

В настоящее время у меня есть несколько веб-сайтов на основе NameVirtualHost с балансировкой нагрузки между 3 apache2 серверы, использующие ldirectord. Я хотел бы вставить лак как обратный веб-прокси между ldirectord и apache следующим образом:

  1. запрос приходит в ldirectord
  2. затем выполняется балансировка нагрузки между 3 серверами apache2 и varnish, с весом 1 для веб-серверов и 99 для varnish (так что, если varnish перезагружен, веб-серверы будут работать без проблем)
  3. Затем varnish будет балансировать нагрузку своих запросов между моими серверами apache2.

Тем не мение, часть лака не работает.

Интересно, связано ли это с тем, что мои серверы apache используют x.x.x.x: 80 для своих NameVirtualHosts вместо *: 80? (они должны это сделать, поскольку на каждом сервере есть несколько IP-адресов)

Или, возможно, это связано с необходимостью настройки IP Forwarding на сервере varnish? (Я сделал echo 1> / proc / sys / net / ipv4 / ip_forward на этом сервере, этого достаточно?)

Как я могу отладить эту проблему?

Вам не нужно включать IP Forwarding на сервере varnish, чтобы он работал. Varnish не будет пересылать клиентское соединение, но, как прокси, создаст новое соединение от имени пользователя.

Если вы можете

telnet apache2 80

или

curl -x apache2:80 http://yoursite.com/yourpage

с сервера лакировки, тогда ваша сетевая настройка в порядке. Для последнего примера добавьте в конфигурацию vcl_recv приведенный ниже код:

# Normalise requests sent via curl's -X mode and LWP.  Must do before
# backend selection.
if (req.url ~ "^http://") {
  set req.url = regsub(req.url, "http://[^/]*", "");
}

Было бы полезно, если бы вы разместили свою конфигурацию лака, но исходная должна работать из коробки (даже если она не кэширует много страниц).

Я предполагаю, что вы создали директора для своих 3 бэкэндов apache и что этот директор является бэкэндом по умолчанию для всех входящих подключений к varnish.

Если да, запустите

varnishlog | grep _health

и убедитесь, что ваши серверы не болеют. Если это так, настройте свой внутренний зонд (проверка работоспособности).

Как правило, Varnish не заботится о том, какая конфигурация виртуального хоста используется в бэкэндах. Я предлагаю вам вернуться к исходной конфигурации и определить для начала единственный бэкэнд. Затем переходите к директору. Только после этого настройте конфигурацию лака.

удачи

Я предполагаю, что вы используете LVS / DR (или LVS / TUN) из-за общего IP-адреса. Я не специалист по сетям, но, насколько я понимаю, ldirectord может отправлять пакеты на определенный сервер с общим IP-адресом, установив правильный MAC-адрес в кадре Ethernet и оставив IP-адрес TCP. / IP-пакет без изменений. Varnish не умеет этого делать (работает на уровне TCP / IP).

Одно из решений - заставить ваши службы apache2 (также) прослушивать комбинацию ip-адрес / порт, которую лак может адресовать, а ваша сеть может маршрутизировать. Можете ли вы добавить IP-адрес внутренней сети на каждый из серверов apache2 и также прослушивать этот адрес?

Другим решением может быть использование фальшивых адресов на сервере varnish для адресации каждого из серверов apache и правильная обработка пакетов исходящей цепочкой межсетевого экрана iptables (установка общего IP-адреса, установка определенного MAC-адреса).

Самым простым было бы использовать MASQ (LVS / NAT) для ваших серверов apache. И LVS, и varnish могут обращаться к ним по одному и тому же IP-адресу (LAN или общедоступный).

Удачи!