nginx proxy_pass usando subcarpeta

11

ok, esta tarea debería ser simple pero no puedo hacer que funcione. Me gustaría tener una subcarpeta después de mi nombre de dominio (en realidad después de la IP de ese nombre de dominio), que redirige a un puerto específico en el mismo servidor. Esencialmente, quiero deshacerme de tener que usar muchos puertos.

Aquí está mi configuración nginx para eso

server {
    listen 80;

    index index.html index.htm index.nginx-debian.html index.php;

    server_name aaa.bbb.ccc.ddd;

    location ^~ /app2 {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://aaa.bbb.ccc.ddd:8001;
    }
}

Entonces, al acceder a aaa.bbb.ccc.ddd / app2, me gustaría que esto se resuelva en http: //aaa.bbb.ccc.ddd: 8001 .

Esto puede ser posiblemente muy complicado. ¿Que me estoy perdiendo aqui?

Gracias Pat

pAt84
fuente
¿Te refieres a "redirecciones a un puerto" o "proxies a un puerto"? Son bastante diferentes Su pregunta no está clara, quizás podría ampliar su caso de uso, incluido el cliente.
Tim

Respuestas:

12

Dado que etiquetó esto como una pregunta de proxy inverso, supongo que quiere decir que desea proxy de la solicitud para que el usuario solo vea la http://aaa.bbb.ccc.ddd/app2URL en su navegador.

Puedes cambiar tu locationbloqueo a esto:

location ~/app2(.*)$ {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://aaa.bbb.ccc.ddd:8001$1;
}

Aquí capturamos la parte URI después /app2de $1variable y la usamos en la proxy_passdirectiva.

Tero Kilkanen
fuente
Gracias. Eso hizo el truco. aaa.bbb.ccc.ddd: 8001 solo se muestra parcialmente. Hay websockets en esa página y un montón de script java. Supongo que es porque proxy el puerto y no lo reenvío como Tim mencionó anteriormente. ¿Es esto realmente posible lograr simplemente usando nginx?
pAt84
¿Cómo son las URL de los recursos en la aaa.bbb.ccc.ddd:8001página? Lo más probable es que necesite corregir las URL para contener la /app2parte.
Tero Kilkanen
Realmente es solo un websocket allí (que muestra algunos datos de radar, automotriz ...). No hay signos de "app2" en el código fuente.
pAt84
Hm ok, si. Para llamar al websocket, JS usa "var ws = new WebSocket ('ws: //' + location.host + '/ ws');". location.host ahora pierde el número de puerto, lo que hace que todo ya no funcione.
pAt84
Ok, parece que una vez que llamo aaa.bbb.ccc.ddd / app2 requiero que use internamente aaa.bbb.ccc.ddd: 8001. Otra opción es cambiar todo el script java. El razonamiento es que quiero usar nginx para darme una "solución de un puerto" pero después de haber accedido (por ejemplo, a través de http // aaa.bbb.ccc.ddd / app2), internamente, lo necesitaría para ir volver a aaa.bbb.ccc.ddd: 8001. ¿Es eso posible?
pAt84