Proxy inverse - Supprimer le sous-répertoire

27

Dans un avenir proche, je vais avoir 3 serveurs nginx. L'un est un proxy inverse pour SSL pour les deux autres. Ainsi, par exemple, je vais à:

https://www.mysitename.com/site1

Les deux autres serveurs dans cet exemple sont site1 et site2. J'ai installé le certificat SSL sur le proxy et je veux utiliser un proxy inverse (SSL non requis car les 3 sont sur un réseau interne) .Pour les tests, je fais écouter nginx sur 443 pour SSL / proxy inverse, écoutez sur le port 8081, qui est une application de rails pour site1, et 8082, pour site2.

J'ai ceci...

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

Ainsi, lorsque je visite www.mysitename.com/site1, je veux qu'il renvoie essentiellement ce qui proviendrait normalement de localhost: 8081 (ou plus tard sur la ligne une adresse IP interne pour un autre serveur).

Existe-t-il un moyen de supprimer le "site1" de l'appel localhost? Ce qu'il semble faire, c'est utiliser localhost: 8081 / site1. Les sites site1 et site2 sont de la nature "/ login / index" ou "/ quel que soit / liste", etc, sans "site1".

Il y a aussi des redirections dans les contrôleurs de site (en utilisant redirect_to) qui vont de choses comme / login / index vers / quoique / liste.

Vais-je devoir reconcevoir les URL du site pour utiliser site1? Ou le proxy NGINX peut-il le comprendre?

Merci.

Chromag
la source
Pour Socket.io essayez ceci ajoutez simplement rewrite /(.*) /socket.io/ break; serverfault.com/questions/444532/…
user956584

Réponses:

53

Citant http://nginx.org/r/proxy_pass :

Si proxy_pass est spécifié avec URI, lors du passage d'une demande au serveur, une partie d'un URI de demande normalisé correspondant à l'emplacement est remplacée par un URI spécifié dans la directive:

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

Autrement dit, vous devez utiliser proxy_passcomme ceci:

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

Notez la fin /de la proxy_passdirective - elle remplacera une partie de l'URI d'origine correspondant à l'emplacement, c'est-à-dire /site1/.

Maxim Dounin
la source
2
Il suffit d'une barre oblique pour résoudre le problème!? Merci pour ça. Maintenant, pour comprendre comment je vais gérer le redirect_to - mais ce n'est pas une question de serveur, je vais donc le découvrir ailleurs.
Chromag
notez que vous avez également besoin de la barre oblique de fin sur l'URL proxy_pass!
Daniel Hill