Прежде всего, вы должны разработать стратегию, чтобы различать используемые приложения. Вы можете использовать разные имена хостов (все они указывают на ваш прокси-сервер Varnish) или вы можете использовать разные URL-адреса, чтобы решить, какой запрос должен обрабатываться какой серверной системой. Если у вас есть стратегия, настройте Varnish:
Пример A) Различные имена хостов
Подготовьте все необходимые серверные модули. Это может быть один сервер или несколько серверов с использованием директора:
backend example1 {
.host = "...";
.port = "...";
...
}
Установите правильный сервер для входящих запросов (в Varnish: req). Я установил дополнительное значение req.http.backend, чтобы использовать его на более позднем этапе. Здесь вы можете заменить или отменить любой HTTP-заголовок запроса клиента:
sub vcl_recv {
...
if (req.http.host == "example1.mysite.com") {
set req.backend = example1;
set req.http.backend = "example1";
set req.http.host = "application1.internal.mysite.com";
unset req.http.Cache-Control;
...
}
...
}
Внесите некоторые изменения в возвращенный ответ серверной части (в Varnish: beresp). Если у вас есть другое имя хоста для приложения, вы можете изменить перенаправления. Обычно я удаляю некоторые X-заголовки или заменяю кеширующие заголовки серверной части здесь:
sub vcl_fetch {
...
if (req.http.backend == "example1") {
...
unset beresp.http.X-Powered-By;
...
if ((beresp.status == 301 || beresp.status == 302) && beresp.http.Location ~ "^http://application1\.internal\.mysite\.com") {
set beresp.http.Location = regsub(beresp.http.Location, "^http://[^/]+", "http://example1.mysite.com");
}
}
...
}
Пример B) Различные URL-адреса
В Varnish разница заключается в методе vcl_recv. Позаботьтесь о том, чтобы ваше приложение могло работать с путем "/ example1". Возможны и другие решения, но я бы не рекомендовал их:
sub vcl_recv {
...
if (req.http.host == "www.mysite.com") {
if (req.url ~ "(?i)^/example1/") {
set req.backend = example1;
set req.http.backend = "example1";
set req.http.host = "application1.internal.mysite.com";
unset req.http.Cache-Control;
...
}
...
}
...
}
Вы можете реализовать A или B или объединить A и B.