Prowadzę kilka kontenerów dokerów z nazwami hostów:
web1.local web2.local web3.local
Trasowanie do nich wykonane na podstawie nazwy hosta przez nginx. Mam proxy przed tą konfiguracją (na innym komputerze podłączonym do Internetu), w którym definiuję upstream jako:
upstream main {
server web1.local:80;
server web2.local:80;
server web3.local:80;
}
I rzeczywisty opis hosta wirtualnego:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://main;
}
}
Ponieważ kontenery otrzymują nazwę hosta „main” zamiast „web1.local”, nie odpowiadają one poprawnie na żądanie.
Pytanie: jak mogę powiedzieć nginx, aby przekazał nazwę serwera nadrzędnego zamiast nazwy nadrzędnej grupy serwerów w nagłówku Host: podczas proxy żądania?
nginx
reverse-proxy
pavel_karoukin
źródło
źródło
Odpowiedzi:
W rzeczywistości możesz to zrobić za pomocą proxy_set_header.
Aby uzyskać więcej informacji, spójrz tutaj: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header lub zobacz przykładowy przypadek użycia tutaj: https://stackoverflow.com/questions/12847771/configure-nginx- with-proxy-pass
Do powyższej konfiguracji dodałem dynamiczne podejście:
Oto przykład ze statyczną nazwą hosta:
źródło
site1.myisp.com
isite2.myisp.com
odpowiadają one tylko na ich nazwy. Teraz jestem właścicielem mojej nazwy domeny i chciałbym korzystać z mojej witryny internetowej dostawcy usług internetowych w celu zrównoważenia obciążenia moich serwerów. Czy to nie jest dobry powód? Dziękuję bardzo;)Miałem ten sam problem i ostatecznie go rozwiązałem, używając dwóch poziomów proxy. Oto, co możesz zrobić dla swojej sytuacji (tak myślę):
Jak widać, sztuczka polega na utworzeniu lokalnego serwera odpowiadającego na konkretny port, który będzie proxy serwera, przepisując odpowiedni Host dla każdego serwera. Następnie możesz użyć tych lokalnych serwerów na swoim serwerze upstream, a na końcu użyć tego na serwerze proxy.
źródło
Tak więc po przeczytaniu całej dokumentacji nginx (tak naprawdę nie mogłem parsować kodu dla upstream module = () wymyśliłem to draństwo rozwiązanie. Niestety to rozwiązanie nie śledzi awarii hostów, ale po prostu wybiera losowy i przekierowuje do niego żądanie. Więc muszę skonfigurować monitorowanie, aby upewnić się, że wszystkie backendy są uruchomione.
źródło
Podajemy adres nadrzędny jako osobny nagłówek taki jak ten
Co jeśli spróbujesz?
źródło
Chociaż cel wydaje się logiczny, nginx nie zmieni nagłówka Host: tak, aby pasował do strumienia nadrzędnego . Zamiast tego traktuje
upstream
nazwy domen jakCNAME
w DNS - jako sposób na uzyskanie adresu IP.Nagłówki (i treść) żądania są ustalane przed wybraniem w górę. Proces wysyłania może zmienić żądanie pośrednie, jeśli okaże się, że dany przekaz nie odpowiada, ale żądanie się nie zmienia.
źródło
Hmm Mam podobną konfigurację, w której po prostu zrobiłem
Użycie
$http_host
(nagłówka hosta HTTP z przychodzącego żądania) tutaj zamiast$host
(konfiguracja nazwy hosta serwera) powoduje, że ten sam nagłówek hosta przekazywany przez klienta jest przekazywany w górę, w moich testach.Zobacz także https://stackoverflow.com/questions/14352690/change-host-header-in-nginx-reverse-proxy .
źródło
Ponieważ inne osoby publikowały już przy użyciu zmiennej skryptu (np. $ Upstream), możesz ustawić ją tak, jak chcesz, i to rozwiąże problem, bez dodatkowego hakowania nagłówka.
Zmienne skryptu obsługi programu proxy Proxy Pass w inny sposób, jeśli wartość nie jest warunkowa (nie ma $ w nazwie), jest cofana do fazy wysyłania na etapie konfiguracji i używana później.
Prostym sposobem na ominięcie tego problemu i uzyskanie większości zalet (bezpłatnej wersji) w górę byłoby użycie czegoś takiego
Split_Clients
:Powyższy przykład wygląda prawie tak samo jak w górę. Istnieją inne moduły wykonujące mapowanie, np. Chash_map_module , ale ponieważ są one poza drzewem, będziesz musiał zbudować je samodzielnie, co nie jest możliwe w niektórych przypadkach użycia /
źródło