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

Как лучше всего запускать сайты Drupal и Django на одном сервере Varnish?

У меня есть веб-сайт с высоким трафиком, работающий с Drupal и Apache, пять веб-серверов за балансировкой нагрузки сервера Varnish. Допустим, это сайт example.com. Я использую пять бэкэндов и такой директор в своем default.vcl:

director balancer round-robin {
  {
   .backend = web1;
  }
  {
  .backend = web2;
  }
  {
  .backend = web3;
  }
  {
  .backend = web4;
  }
  {
  .backend = web5;
  }
}

Сейчас я работаю над новым проектом Django, который станет новым разделом этого сайта, работающим по адресу example.com/new-section.

После проверки документация Я обнаружил, что могу сделать что-то вроде этого:

sub vcl_recv {
     if (req.url ~ "^/new-section/") {
         set req.backend = newbackend;
     } else {
         set req.backend = default;
     }
}

То есть, используя другой бэкэнд для подкаталога / нового раздела в том же домене.

Мой вопрос в том, как заставить что-то подобное работать с моим директором и настройкой балансировки нагрузки?

Я, вероятно, собираюсь запустить два или более веб-сервера (бэкэндов) с моим новым проектом Django, каждый из которых будет содержать смесь Gunicorn, Nginx и нескольких пакетов Python, и хотел бы поместить все их в свой собственный Varnish Director. чтобы загрузить баланс.

Можно ли использовать описанный выше подход, чтобы решить, какой директор использовать? Примерно так:

sub vcl_recv {
     if (req.url ~ "^/new-section/") {
         set req.director = newdirector;
     } else {
         set req.director = balancer;
     }
}

Все предложения приветствуются.

Спасибо!

Я прочитал документацию Varnish еще несколько раз и начал играть с моей локальной настройкой, и у меня все заработало. Varnish, по крайней мере, версия 2.1, которую я использовал для своих тестов, рассматривает директор как бэкэнд, поэтому вы можете проверить set request.backend, и он установит правильный директор для использования. Итак, я сделал это:

if (req.url ~ "^/new-section") {
   set req.backend = django_balancer;
} else {
   set req.backend = balancer;
}

куда django_balancer это новый режиссер, созданный так же, как и мой оригинальный балансир (подробности см. в вопросе). Очевидно, этот новый директор должен указать на настройку веб-серверов для обслуживания проекта Django.

Теперь Varnish будет обслуживать все, используя директор для серверов Drupal, за исключением URL-адресов, начинающихся с / new-section, которые будут обслуживаться директором для серверов Django.

В default.vcl есть дополнительная настройка для Drupal и Django, чтобы правильно обрабатывать файлы cookie с помощью Varnish, но это еще одна проблема, и в Интернете уже есть несколько ресурсов с подробностями о том, как с этим справиться.

И, кстати, я получил подсказку от Вики-страница Varnish о балансировке нагрузки, это была ключевая часть:

 You can send traffic to your brand new director in vcl_recv, like this:

 sub vcl_recv {
    if (req.http.host ~ "^(www.)?mysite.com$") {
      set req.backend = baz;
    }
 }

Я думаю использование req.backend сбивает с толку, должно быть что-то вроде req.director чтобы было понятнее.