El proxy inverso de Nginx solo tiene un subdirectorio específico y pasa por todo lo demás

El proxy inverso de Nginx solo tiene un subdirectorio específico y pasa por todo lo demás

Tengo una situación de desarrollo en la que tengo un dominio con múltiples servicios:

https://somewebpage.com

En este servicio hay varios proyectos como subdirectorios.

  • https://somewebpage.com<- página de destino
  • https://somewebpage.com/api<- resto del servidor API
  • https://somewebpage.com/app<- mi aplicación

Entonces, ¿es posible (y cómo) configurar nginx y el archivo hosts para invertir el proxy solo https://somewebpage.com/appen mi compilación local http://localhost:3000?

El problema es que cuando se implementa la aplicación, no tiene problemas para acceder al /apiservidor restante, pero cuando se sirve localmente, mi proxy inverso nginx también intercepta landing pagey URL.rest api server

Mi configuración de nginx se ve así:

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

Y en mi /etc/hoststengo:

127.0.0.1    somewebpage.com

¿Existen otros trucos sobre cómo lograr un resultado similar?

La razón por la que intento hacer esto es que si lo hago desde mi localhost:3000responderá con CORSerrores y rechazará mis llamadas /api.

¿O esto supone demasiado riesgo para la seguridad y tengo que solicitar otra forma de acceso /api?

Gracias por sus respuestas de antemano.

Respuesta1

Es necesario agregar lo siguiente:

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

Esto le dice a nginx cómo manejar las solicitudes que no coinciden con las otras especificadas location. Para obtener más información sobre cómo nginx selecciona locationel bloque a usar, leadocumentación nginx.

Respuesta2

Se me ocurrió una solución que funciona para mí.

somewebpage.comapunta a xx.xx.xx.xxuna dirección IP estática, así que agregué otro proxy hacia esa dirección IP en lugar de una URL similar a la respuesta 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;
  }

De esa manera, /etc/hostsel archivo no interceptará mi somewebpage.comsolicitud, ya que la solicitud omitirá la resolución del dominio.

Entonces, al final terminé con la siguiente configuración de nginx que funcionó para mí:

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

Es posible que esta solución no funcione para todos debido a múltiples direcciones IP detrás de escena o direcciones IP dinámicas o algo más. Pero funcionó para mí y fue lo suficientemente bueno para fines de desarrollo.

información relacionada