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

Замена Apache2 на Varnish в качестве обратного прокси

У меня возникли проблемы с заменой правила обратного прокси Apache2 для ACL Varnish.

Правило apache:

<Location /MySite>
    ProxyPass       http://192.168.0.123/OtherSite
</Location>

Мой Varnish ACL:

if (req.url ~ "^/(?i)MySite") {
    set req.backend = myhost; # 192.168.0.123
    set req.url = regsub(req.url, "^/(?i)MySite", "/OtherSite");
    return (pipe);
}

Это приводит к тому, что URL-адрес на стороне клиента меняется на «/ OtherSite», чего я не хочу. В этом сценарии, когда пользователь вводит http://www.myhost.com/MySite, ответ перенаправляет браузер пользователя на http://www.myhost.com/OtherSite. Я хочу, чтобы это «перенаправление» происходило только при запросе серверной части varnish, имеющем такое же поведение, что и ProxyPass Apache.

Как я могу этого добиться?

Спасибо

Пожалуйста, попробуйте это:

sub vcl_recv {
  ...
  if (req.url ~ "(?i)^/MySite") {
    set req.backend = myhost;
    set req.url = regsub(reg.url, "(?i)^/MySite", "/OtherSite");
  }
  ..
  return (lookup);
}
  1. Параметры для регулярных выражений необходимо вводить сразу после открывающих кавычек. Посмотреть здесь: https://www.varnish-cache.org/docs/3.0/reference/vcl.html#regular-expressions
  2. На самом деле для Varnish req.url будет начинаться с "/", поскольку это часть URL-адреса, следующая за портом, или (если порт не указан) хост-часть URL-адреса. Поэтому вы можете заменить "/?" с участием "/".
  3. Пока вы хотите использовать Varnish в качестве обратного прокси (говоря об ускорении веб-сайтов путем кэширования), вам следует избегать этого «return (pipe);». Это означает поток внутренних данных, но не трогать и не кэшировать их. Поэтому я удалил эту строку. Вместо этого вы видите метод по умолчанию «return (lookup);» для обработки запроса в кеше обратного прокси. Смотрите здесь блок-схему Varnish: https://www.varnish-software.com/static/book/VCL_Basics.html#vcl-request-flow

Удачи и получайте удовольствие от Varnish.