Odwrotny serwer proxy - usuń podkatalog

27

W najbliższej przyszłości będę miał 3 serwery Nginx. Jeden jest odwrotnym proxy dla SSL dla dwóch pozostałych. Idę na przykład do:

https://www.mysitename.com/site1

Dwa pozostałe serwery w tym przykładzie to site1 i site2. Zainstalowałem certyfikat SSL na proxy i chcę użyć zwrotnego proxy (SSL nie jest wymagany, ponieważ wszystkie 3 są w sieci wewnętrznej). Dla celów testowych mam Nginx nasłuchujący na 443 dla SSL / reverse-proxy, słuchaj dalej port 8081, który jest aplikacją railsową dla strony 1, a 8082 jest dla strony 2.

Mam to...

server {
    listen                  443;
    server_name             mysitename.com;

    ssl                     on;
    ssl_certificate         ssl/mysitename.com.crt;
    ssl_certificate_key     ssl/mysitename.com.key;
    keepalive_timeout       60;

    location /site1 {
        proxy_pass http://localhost:8081;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }

    location /site2 {
        proxy_pass http://localhost:8082;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }
}

Więc kiedy odwiedzam www.mysitename.com/site1, chcę, aby w zasadzie zwrócił to, co normalnie pochodzi z localhost: 8081 (lub później wewnętrzny adres IP innego serwera).

Czy istnieje sposób, aby usunąć „site1” z wywołania localhost? Wydaje się, że robi to za pomocą localhost: 8081 / site1. Witryny site1 i site2 mają charakter „/ login / index” lub „/okolwiek / lista” itd., Bez „site1”.

Istnieją również przekierowania w kontrolerach strony (za pomocą redirect_to), które przechodzą z takich rzeczy jak / login / index do / what / list.

Czy będę musiał przeprojektować adresy URL witryny, aby korzystać z witryny 1? Czy może proxy NGINX to rozgryza?

Dzięki.

Chromag
źródło
W przypadku Socket.io spróbuj tego po prostu dodaj przepisz /(.*) /socket.io/ break; serverfault.com/questions/444532/…
user956584

Odpowiedzi:

53

Cytując http://nginx.org/r/proxy_pass :

Jeśli parametr proxy_pass jest podany za pomocą identyfikatora URI, podczas przekazywania żądania do serwera część znormalizowanego identyfikatora URI żądania pasującego do lokalizacji jest zastępowana identyfikatorem URI określonym w dyrektywie:

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}

Oznacza to, że musisz użyć w proxy_passten sposób:

location /site1/ {
    proxy_pass http://localhost:8081/;
    ...
}

Zwróć uwagę na końcowe /w proxy_passdyrektywie - zastąpi ona część oryginalnego identyfikatora URI dopasowanego przez lokalizację, tj /site1/.

Maxim Dounin
źródło
2
Wystarczyło ukośnik, aby rozwiązać problem !? Dziękuję za to. Teraz, aby dowiedzieć się, jak obsłużyć redirect_to - ale to nie jest pytanie serwera, więc wymyślę to gdzie indziej.
Chromag
Uwaga, potrzebujesz także ukośnika końcowego na adresie URL proxy_pass!
Daniel Hill