NGINX Proxy reverso não carregando recursos

1

Estou tentando colocar um proxy reverso na frente de alguns serviços da Web internos.

O Nginx está configurado e funcionando corretamente para atender à solicitação. Se eu só servir um location / no meu arquivo conf, ele carrega esse destino proxy_pass com sucesso, por exemplo:

location / {
  proxy_pass https://internal.ip:port/;
 }

A navegação para o link carrega esse recurso interno na perfeição.

No entanto, como tenho vários aplicativos internos, desejo fazer proxy de todos eles por meio do nginx. Então, no meu teste eu mudei o conf para o seguinte:

location /app1 {
  proxy_pass https://internal.ip:port/;
}

Com isso, recebo a página principal / padrão do índice interno do aplicativo, mas a fonte da exibição mostra que nenhuma folha de estilo, js ou outros recursos estão sendo reescritos. Portanto, todo o conteúdo da página não é carregado. No Apache, eu provavelmente escreveria um proxyhtmlurlmap ^/resource/ /app1/resource R . Eu não consigo encontrar qualquer maneira de conseguir isso no nginx embora.

Eu também tentei isso, sem sucesso:

location /app1 {
  rewrite /resource(.*?) /app1/resource$1 break;
  proxy_pass https://internal.ip:port/;
 }

Como faço para que o nginx preencha corretamente o local de destino (app1) para os URLs de recursos solicitados para que eles sejam carregados?

    
por PenguinCoder 12.01.2016 / 01:49

5 respostas

2

Como não tenho crédito suficiente, não posso comentar as entradas, então, aqui vem minha resposta como uma entrada separada.

Não sei por que o OP discorda, mas acho que Martin Fjordval identifica o problema corretamente e sugere a coisa certa. Eu sugeriria uma ligeira modificação em seu trecho, como abaixo:

                location /app1/ {
                    proxy_set_header Host $http_host/app1;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Scheme $scheme;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_redirect    off;
                    add_header Pragma "no-cache";
                    add_header Cache-Control "no-cache";

                    proxy_pass http://internal.ip:port/;
                    sub_filter 'action="/'  'action="/app1/';
                    sub_filter 'href="/'  'href="/app1/';
                    sub_filter 'src="/'  'src="/app1/';
                    sub_filter_once off;
            }

Portanto, se você tiver certeza de que todos os seus URLs relativos que estão começando com '/' precisam ser redirecionados, o texto acima acrescentaria '/ app1 /' a todos eles e os pegaria pelo bloco 'location / app1 /' quando referenciado. Você pode então visualizar a fonte da página e confirmar que a reescrita está acontecendo.

Você provavelmente também precisaria do todo ou pelo menos da parte do shabang 'proxy_set_header', especialmente o 'proxy_set_header Host $ http_host / app1'.

    
por 08.11.2016 / 13:33
1

Acabei de usar o proxy baseado em subdomínio. O básico é assim:

server {
   listen 443 ssl;
   ssl on;
   ssl_cert <cert>;
   ssl_key <key>;

   server_name appname1.public.com;

   location / {
     proxy_pass https://internalapp1.ip:port
    }
}

server {
   listen 443 ssl;
   ssl on;
   ssl_cert <cert>;
   ssl_key <key>;

   server_name appname2.public.com;

   location / {
     proxy_pass https://internalapp2.ip:port
    }
}

Isso elimina a necessidade de ter qualquer URL direto ou reescrita de recursos.

    
por 13.01.2016 / 02:08
0

Você especificou um único URL absoluto no seu local, não o URL da página e todos os recursos que a página usa. Você precisa especificar uma expressão regular que comece com esse URL. Algo como isso pode funcionar (eu não testei)

location ~ /app1(/.*) {
  proxy_pass https://internal.ip:port/;
}
    
por 12.01.2016 / 01:58
0

Se eu entendi o problema corretamente, parece que o problema é que seu aplicativo acha que ele está hospedado na raiz uri / enquanto está hospedado em /app1 e simplesmente não foi informado disso. O Nginx normalmente não modifica a resposta dos seus backends, o que é o que você espera, no entanto, é possível.

Primeiro, você quer verificar se há uma opção de configuração no seu aplicativo onde você pode definir a raiz uri. Se houver, então, definir essa é de longe a solução mais fácil.

Se você não encontrar nada, poderá usar o módulo de substituição para substituir os URLs no HTML. Observe que, para que isso funcione, você precisa desativar a codificação GZIP no backend para que o nginx possa ver o HTML descompactado.

Um exemplo de como seu subfiltro pode se parecer

location /app1 {
    sub_filter '<a href="/resource/' '<a href="/app1/resource/';
    sub_filter_once off;

    proxy_pass https://internal.ip:port/;
}
    
por 12.01.2016 / 05:39
-1

Eu tive o mesmo problema; a página de índice estava sendo carregada, mas todos os recursos receberam 404.

Percebi que no local que eu tinha: try_files $uri $uri/ =404; Isso retorna 404 para todos os recursos. Apenas remova-o.

location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        # try_files $uri $uri/ =404;                       <---- Comment out this line.
        # Uncomment to enable naxsi on this location
        # include /etc/nginx/naxsi.rules
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
    
por 27.09.2016 / 14:34

Tags