O proxy reverso Nginx apenas subdiretório específico e passa por todo o resto

O proxy reverso Nginx apenas subdiretório específico e passa por todo o resto

Tenho uma situação de desenvolvimento onde tenho um domínio com vários serviços:

https://somewebpage.com

Neste serviço existem vários projetos como subdiretórios

  • https://somewebpage.com<- página de destino
  • https://somewebpage.com/api<- servidor de API de descanso
  • https://somewebpage.com/app<- meu aplicativo

Então, é possível (e como) configurar o arquivo nginx e hosts para reverter o proxy apenas https://somewebpage.com/apppara minha compilação local http://localhost:3000?

O problema é que quando o aplicativo é implantado não há problemas para acessar o servidor rest, mas ao servir localmente, minhas interceptações e URLs /apide proxy reverso nginx também.landing pagerest api server

Minha configuração do nginx é semelhante a:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    
    keepalive_timeout  65;
    
    index index.html;

    proxy_max_temp_file_size 0;
    proxy_buffering off;

    server {
        listen 80;
        server_name somewebpage.com;

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name somewebpage.com;

        ssl_certificate /etc/ssl/certs/certificate.crt;
        ssl_certificate_key /etc/ssl/certs/ccertificate.key;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

        location /app {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass http://localhost:3000;
        }
    }
}

E no meu /etc/hostseu tenho:

127.0.0.1    somewebpage.com

Existem outros truques para obter resultados semelhantes?

A razão pela qual tento fazer isso é que, se eu fizer isso, localhost:3000ele responderá com CORSerros e rejeitará minhas chamadas para /api.

Ou isso é um grande risco à segurança e tenho que pedir outra forma de acesso /api?

Obrigado por suas respostas antecipadamente.

Responder1

Você precisa adicionar o seguinte:

location / {
    try_files $uri $uri/ =404;
}

Isso informa ao nginx como lidar com solicitações que não correspondem às outras especificadas location. Para obter mais informações sobre como o nginx seleciona locationo bloco a ser usado, leiadocumentação nginx.

Responder2

Eu encontrei uma solução que funciona para mim.

somewebpage.comaponta para xx.xx.xx.xxum endereço IP estático, então adicionei outro proxy para esse endereço IP em vez de um URL semelhante à resposta de Tero Kilkanen.

  location / {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_pass https://xx.xx.xx.xx;
  }

Dessa forma, /etc/hostso arquivo não interceptará minha somewebpage.comsolicitação, pois a solicitação ignorará a resolução do domínio.

Então, no final, acabei com a seguinte configuração do nginx que funcionou para mim:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    
    keepalive_timeout  65;
    
    index index.html;

    proxy_max_temp_file_size 0;
    proxy_buffering off;

    server {
        listen 80;
        server_name somewebpage.com;

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name somewebpage.com;

        ssl_certificate /etc/ssl/certs/certificate.crt;
        ssl_certificate_key /etc/ssl/certs/ccertificate.key;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

        location /app {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass http://localhost:3000;
        }

        location / {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass https://xx.xx.xx.xx;
        }
    }
}

Esta solução pode não funcionar para todos devido a vários endereços IP ocultos ou endereços IP dinâmicos ou qualquer outra coisa. Mas funcionou para mim e foi bom o suficiente para fins de desenvolvimento.

informação relacionada