nginx proxy_pass usando subpasta

11

ok, essa tarefa deve ser simples, mas simplesmente não consigo fazê-la funcionar. Gostaria de ter uma subpasta após o meu nome de domínio (na verdade, após o IP desse nome de domínio), que redireciona para uma porta específica no mesmo servidor. Essencialmente, quero me livrar de ter que usar muitas portas.

Aqui está minha configuração nginx para isso

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

Portanto, ao acessar aaa.bbb.ccc.ddd / app2, gostaria que isso fosse resolvido para http: //aaa.bbb.ccc.ddd: 8001 .

Isso pode ser possivelmente muito complicado. O que estou perdendo aqui?

Obrigado Pat

pAt84
fonte
Você quer dizer "redireciona para uma porta" ou "proxies para uma porta"? Eles são bem diferentes. Sua pergunta não é clara; talvez você possa expandir seu caso de uso, incluindo o cliente.
Tim

Respostas:

12

Como você marcou isso como uma pergunta de proxy reverso, suponho que você queira fazer um proxy da solicitação para que o usuário veja apenas o http://aaa.bbb.ccc.ddd/app2URL no navegador dela.

Você pode alterar seu locationbloco para isso:

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

Aqui capturamos a parte do URI após /app2a $1variável e a usamos na proxy_passdiretiva.

Tero Kilkanen
fonte
Obrigado. Isso meio que fez o truque. aaa.bbb.ccc.ddd: 8001 é exibido apenas parcialmente. Existem websockets nessa página e muitos scripts java. Eu acho que é porque eu proxy da porta e não encaminhá-lo como Tim mencionado acima. Isso é realmente possível de obter usando apenas o nginx?
pAt84 27/07
Como são os URLs de recursos na aaa.bbb.ccc.ddd:8001página? Provavelmente, você precisa corrigir os URLs para conter a /app2parte.
Tero Kilkanen
É realmente apenas um websocket lá (mostrando alguns dados de radar, automotivo ...). Não há sinal de "app2" no código fonte.
P8484
Hum ok, sim. Para chamar o websocket, o JS usa "var ws = new WebSocket ('ws: //' + location.host + '/ ws');". location.host agora perde o número da porta, o que faz a coisa toda não funcionar mais.
pAt84
Ok, parece que uma vez que chamo aaa.bbb.ccc.ddd / app2, preciso que ele use internamente aaa.bbb.ccc.ddd: 8001. Outra opção é alterar todo o script java. O raciocínio é que eu quero usar o nginx para me fornecer uma "solução de uma porta", mas depois de acessar (por exemplo, sobre http // aaa.bbb.ccc.ddd / app2), eu precisaria internamente para ir de volta a aaa.bbb.ccc.ddd: 8001. Isso é possível?
Pat84 27/07/16