У меня есть веб-сайт с высоким трафиком, работающий с 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 чтобы было понятнее.