Proxy inverso: eliminar subdirectorio

27

En un futuro cercano tendré 3 servidores nginx. Uno es un proxy inverso para SSL para los otros dos. Entonces, por ejemplo, voy a:

https://www.mysitename.com/site1

Los otros dos servidores en este ejemplo son sitio1 y sitio2. Instalé el certificado SSL en el proxy y quiero usar un proxy inverso (no se requiere SSL ya que los 3 están en una red interna). Para fines de prueba, tengo nginx listen en 443 para SSL / proxy inverso, escuche puerto 8081, que es una aplicación de rieles para el sitio1, y 8082 es para el sitio2.

Tengo esto...

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

Entonces, cuando visito www.mysitename.com/site1, quiero que básicamente devuelva lo que normalmente vendría de localhost: 8081 (o más adelante una IP interna para otro servidor).

¿Hay alguna manera de que elimine el "sitio1" de la llamada localhost? Lo que parece estar haciendo es usar localhost: 8081 / site1. Los sitios site1 y site2 son de la naturaleza "/ login / index" o "/ whatever / list", etc., sin "site1".

También hay redireccionamientos en los controladores del sitio (usando redirect_to) que van desde cosas como / login / index a / whatever / list.

¿Voy a tener que rediseñar las URL del sitio para usar el sitio1? ¿O puede el proxy NGINX resolverlo?

Gracias.

Chromag
fuente
Para Socket.io intente esto simplemente agregue rewrite /(.*) /socket.io/ break; serverfault.com/questions/444532/…
user956584

Respuestas:

53

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

Si proxy_pass se especifica con URI, al pasar una solicitud al servidor, parte de un URI de solicitud normalizada que coincide con la ubicación se reemplaza por un URI especificado en la directiva:

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

Es decir, tienes que usar proxy_passasí:

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

Tenga /en cuenta el final de la proxy_passdirectiva: reemplazará parte del URI original que coincida con la ubicación, es decir /site1/.

Maxim Dounin
fuente
2
¡¿Todo lo que se necesitó fue un corte final para solucionar el problema ?! Gracias por eso. Ahora para descubrir cómo voy a manejar el redirect_to, pero esa no es una pregunta del servidor, así que lo resolveré en otro lugar.
Chromag
tenga en cuenta que también necesita la barra diagonal final en la URL proxy_pass.
Daniel Hill