Redirecionar o tráfego com base no URL para o endereço IP diferente, mantendo as informações de porta e URL [duplicado]

4

Temos uma versão do controle de qualidade, uma versão do UAT e uma versão DEV do aplicativo da Web. Os usuários precisam acessá-los via http://uat.company.com:41002/webapp , http://qa.company.com:41002/webapp e http://dev.company.com:41002/webapp . Há também um webapp diferente na porta 41001 e também na porta 8080 que precisam acessar.

Esses URLs precisam estar disponíveis externamente para a empresa e só temos um endereço IP público no qual eles podem ser acessados. Como tal, os registros DNS precisam de todos os 3 endereços para apontar para um IP. Nesse endereço IP único, um servidor reside executando nginx. no fundo eu preciso de cada URL para apontar para um servidor diferente

http://uat.company.com --> 123.123.123.1
http://qa.company.com  --> 123.123.123.2
http://dev.company.com --> 123.123.123.3

Eu tenho medo de não saber a terminologia correta, no entanto, o restante do URI e a porta também devem ser transferidos para o endereço IP. Ou seja se alguém visitar

http://uat.company.com:41002/webapp/somepage'

aparecerá como se fosse a página que eles visitaram, mas na verdade eles estarão olhando para

http://123.123.123.1:41002/webapp/somepage

ou se eles visitaram

http://qa.company.com:8080/static/home.html

eles estariam realmente olhando para

http://123.123.123.2:8080/static/home.html

mas o navegador ainda diria http://qa.company.com:8080/static/home.html

Eu tentei

server {

    server_name uat.company.com;

    listen 41001;
    listen 41002;
    listen 8080;

    location / {
            proxy_pass http://123.123.123.1:$server_port$uri;
            proxy_set_header Host $host;
    }

}

no entanto, isso me dá uma página de gateway ruim 502 com log: 2015/01/28 16:04:49 [crit] 30571#0: *1 connect() to 123.123.123.1:41002 failed (13: Permission denied) while connecting to upstream, client: 172.23.128.245, server: uat.company.com, request: "GET /webapp/ HTTP/1.1", upstream: "http://123.123.123.1:41002/webapp/", host: "uat.company.com:41002"

Espero que isso seja mais claro.

Atualizar A partir da sugestão de Xaviers de que o SELinux poderia estar atrapalhando, eu o desabilitei e fui mais longe. Usar a configuração nginx acima agora parece estar se conectando ao segundo servidor: A porta, entretanto, ainda não é executada. Eu estou chamando

uat.company.com:41002/webapp/

Isto, se chamar o serviço diretamente, redireciona para

uat.company.com:41002/webapp/spring/config/main

No entanto, o que está acontecendo por meio do proxy é que ele está retornando ou terminando em

uat.company.com/webapp/spring/config/main

e, portanto, não consegue carregar uma página ...

    
por Mitch Kent 28.01.2015 / 15:53

2 respostas

6

Eu determinei quais eram os problemas com a minha configuração.

1) O SELinux estava me impedindo de se conectar com o upstream. Eu já desativei isso e considerarei configurá-lo corretamente mais tarde

2) proxy_pass estava fazendo o seu trabalho como esperado, no entanto os argumentos que eu precisava eram http://123.123.123.1:$server_port/$uri$is_args$args;

3) proxy_set_header Host $host definiu corretamente o nome do host para o que eu queria, no entanto ele comeu o número da porta. O formato correto para minhas necessidades é proxy_set_header Host $host:$server_port

Pode haver soluções mais simples para isso, e ainda não tenho uma solução de trabalho completa, já que a reduzi para que funcione, no entanto, uma seção de trabalho da minha configuração é:

server {
    listen 41002;
    server_name uat.comapny.com;

    location /webapp {
        proxy_pass http://123.123.123.1:41002/$uri$is_args$args;
        proxy_set_header Host $host:$server_port;
    }
}

Eu vou postar uma versão mais genérica assim que eu detalhar. Muito obrigado a todos que ajudaram.

    
por 29.01.2015 / 12:16
4

Você deseja manter a porta e, em seguida, deve colocá-la em proxy_pass .

server {

    server_name bob.something.com;

    listen 41001;
    listen 41002;
    listen 8080;

    location / {
            proxy_pass http://123.123.123.1:$server_port$uri;
            proxy_set_header Host $host;
    }
}

Você precisa perceber que isso é uma solicitação de proxy por meio do nginx.

    
por 28.01.2015 / 17:04