Reverse Proxy - Unterverzeichnis entfernen

27

In naher Zukunft werde ich 3 Nginx-Server haben. Einer ist ein Reverse-Proxy für SSL für die beiden anderen. Also gehe ich zum Beispiel zu:

https://www.mysitename.com/site1

Die beiden anderen Server in diesem Beispiel sind Site1 und Site2. Ich habe das SSL-Zertifikat auf dem Proxy installiert und möchte einen Reverse-Proxy verwenden (SSL ist nicht erforderlich, da sich alle drei in einem internen Netzwerk befinden) Port 8081 ist eine Rails-App für Site1 und 8082 für Site2.

Ich habe das...

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://;
    }
}

Wenn ich also www.meineSitenname.com/site1 besuche, möchte ich, dass es im Grunde das zurückgibt, was normalerweise von localhost kommt: 8081 (oder später eine interne IP für einen anderen Server).

Gibt es eine Möglichkeit, die "site1" aus dem localhost-Aufruf zu entfernen? Anscheinend wird localhost verwendet: 8081 / site1. Die Sites site1 und site2 haben die Art "/ login / index" oder "/ whatever / list" usw., ohne "site1".

Es gibt auch Umleitungen in den Site-Controllern (mit redirect_to), die von / login / index zu / whatever / list führen.

Muss ich die URLs der Site neu gestalten, um site1 zu verwenden? Oder kann der NGINX-Proxy es herausfinden?

Vielen Dank.

Chromag
quelle
Füge für Socket.io einfach /(.*) /socket.io/ break hinzu. serverfault.com/questions/444532/…
user956584

Antworten:

53

Zitieren von http://nginx.org/r/proxy_pass :

Wenn mit URI proxy_pass angegeben wird, wird beim Übergeben einer Anforderung an den Server ein Teil einer normalisierten Anforderungs-URI, die mit dem Speicherort übereinstimmt, durch eine in der Direktive angegebene URI ersetzt:

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

Das heißt, Sie müssen proxy_passwie folgt verwenden :

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

Beachten Sie das Nachstellen /in der proxy_passDirektive - es ersetzt einen Teil der ursprünglichen URI, die mit der Position übereinstimmt, d /site1/. H.

Maxim Dounin
quelle
2
Alles, was es brauchte, war ein abschließender Schrägstrich, um das Problem zu beheben !? Dank dafür. Nun, um herauszufinden, wie ich mit redirect_to umgehen werde - aber das ist keine Serverfrage, also werde ich das woanders herausfinden.
Chromag
Beachten Sie, dass Sie auch den abschließenden Schrägstrich in der URL proxy_pass benötigen!
Daniel Hill,