Porównaj ceny domen i usług IT, sprzedawców z całego świata

Równoważenie obciążenia Varnish z przepisywaniem żądań serwera


Próbuję zrównoważyć obciążenie aplikacji internetowej innej firmy za pomocą Varnish, a ta aplikacja innej firmy wymaga `` prawdziwej '' nazwy serwera (wygląda na to, że łączy się z tym serwerem po nazwie w tle (a localhost nie działa): (), aby przejść do, potrzebuję również przełączania awaryjnego, co oznacza, że ​​chciałbym używać reżyserów, aby moja konfiguracja była prosta i skalowalna.
Oto prosty przykład tego, co ja

lubić

zrobić:
sub vcl_pass {
set bereq.http.X-Varnish-Backend = bereq.backend.name
}

Jednak plik backend.name jest dostępny tylko w beresp po wysłaniu żądania. Wygląda na to, że Varnish nie decyduje, którego zaplecza użyć

po

vcl_pass kończy działanie i nie ma innego podpięcia przed wysłaniem żądania do zaplecza.
Prawda? Jeśli tak, czy jest jakieś inne rozwiązanie (inne niż poprawka serwera WWW, nad którą nie mam kontroli)? Bez pętli, nawet jeśli zaimplementuję wymianę dyrektora klienta w VCL, nie da się skalować poza kilka serwerów.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Najpierw musisz opracować strategię rozróżniania używanych aplikacji. Możesz użyć różnych nazw hostów (wszystkie wskazują na serwer proxy Varnish) lub możesz użyć różnych adresów URL, aby zdecydować, które żądanie ma być obsługiwane przez który system serwera. Gdy masz już strategię, skonfiguruj Varnish:

Przykład A) Różne nazwy hostów

Przygotuj wszystkie wymagane backendy. Może to być jeden serwer lub wiele serwerów korzystających z dyrektora:
backend example1 {
.host = "...";
.port = "...";
...
}

Zainstaluj właściwy serwer dla żądań przychodzących (w Varnish: req). Ustawiłem dodatkową wartość dla req.http.backend, aby móc z niej skorzystać na późniejszym etapie. Oto jak można zamienić lub cofnąć dowolny nagłówek HTTP żądania klienta:
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;
...
}
...
}

Wprowadź zmiany w zwróconej odpowiedzi zaplecza (w Varnish: beresp). Jeśli masz inną nazwę hosta dla aplikacji, możesz zmienić przekierowania. Zwykle usuwam niektóre nagłówki X lub zastępuję buforujące nagłówki zaplecza tutaj:
sub vcl_fetch {
...
if (req.http.backend == "example1") {
...
unset beresp.http.X-Powered-By;
...
if ((beresp.status == 301 || beresp.status == 302) && beresp.http.Location ~ "^[url=http://application1]http://application1[/url]\.internal\.mysite\.com") {
set beresp.http.Location = regsub(beresp.http.Location, "^http://[^/]+", "[url=http://example1.mysite.com"]http://example1.mysite.com"[/url];);
}
}
...
}


Przykład B) różne adresy URL

Różnica w lakierze polega na metodzie vcl_recv. Upewnij się, że Twoja aplikacja może działać ze ścieżką „/ example1”. Możliwe są inne rozwiązania, ale nie polecałbym tego:
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;
...
}
...
}
...
}

Możesz wdrożyć A lub B lub połączyć A i B. (Mniej więcej) Z Lakierem wszystko jest możliwe.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się