es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El proxy inverso de Nginx con docker-compose no reenvía solicitudes.

He estado creando un proyecto micro frontend y el pegamento (nginx) no está funcionando como se espera.

Mis proyectos están estructurados de la siguiente manera:

/app1
  Dockerfile
/app2
  Dockerfile
/nginx
  Dockerfile
  nginx.conf
/shell
  Dockerfile
docker-compose.local.yaml

Los Dockerfiles del proyecto se ven así:

FROM nginx:alpine
RUN rm -rf /usr/share/nginx/html/*
COPY --from=builder /app/dist/shell /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]

El Dockerfile de nginx:

FROM nginx:alpine
COPY ./nginx.conf /etc/nginx/conf.d/nginx.conf

El archivo nginx.conf:

upstream shell {
  server localhost:3001;
}

upstream app1 {
  server localhost:3002;
}

upstream app2 {
  server localhost:3003;
}

log_format compact '$request $status - $bytes_sent';
access_log off;

server {
  listen 80;
  listen [::]:80;

  access_log /var/log/nginx/access.log compact;
  ssi on;

  location = / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass  http://shell;
  }

  location /app1/ {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass  http://app1/;
  }

  location /app2/ {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass  http://app2/;
  }
}

Finalmente el archivo docker-compose.local.yaml:

version: '3.8'

services:
  nginx:
    image: localhost:5000/nginx:alpine
    build: ./nginx
    ports:
      - "3000:80"
    depends_on:
      - shell
      - app1
      - app2

  shell:
    image: localhost:5000/mf-angular-shell
    build: ./shell
    ports:
      - "3001:80"

  app1:
    image: localhost:5000/mf-angular-app1
    build: ./app1
    ports:
      - "3002:80"

  app2:
    image: localhost:5000/mf-angular-app2
    build: ./app2
    ports:
      - "3003:80"

La aplicación se lanza así:

docker-compose -f docker-compose.local.yaml up -d

Después de lanzar puedo navegar a las aplicaciones individuales sin problemas. Pero cuando navego a la raíz <http: localhost:3000/=""> solo veo el mensaje “Welcome to nginx!”.

Cuando navego a las rutas individuales como <http: localhost:3000/app1/=""> veo el siguiente error en la terminal del proxy:

"/usr/share/nginx/html/app1" failed (2: No such file or directory)

Y un error 404 en el navegador.

¿Es el problema debido a que he sobrescrito el archivo incorrecto? ¿/etc/nginx/conf.d/nginx.conf o es un problema con la configuración en sí? ¿Algo completamente diferente?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según la información proporcionada, parece que el problema puede estar relacionado con el archivo de configuración de nginx. Específicamente, las directivas proxy_pass pueden no estar configuradas correctamente.

    En el archivo nginx.conf, los bloques upstream definen los servidores a los que se deben enviar las solicitudes. Sin embargo, las directivas proxy_pass en los bloques location hacen referencia a los bloques upstream con una barra diagonal al final:

    location /app1/ {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_pass  http://app1/;
    }
    
    location /app2/ {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_pass  http://app2/;
    }
    

    Esto significa que cuando se proxy la solicitud al servidor upstream, la URL incluirá la barra diagonal al final. Por ejemplo, una solicitud a http://localhost:3000/app1/test se proxy a http://app1/app1/test.

    Para solucionar esto, las directivas proxy_pass deben hacer referencia a los bloques upstream sin la barra diagonal al final:

    location /app1/ {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_pass  http://app1;
    }
    
    location /app2/ {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_pass  http://app2;
    }
    

    Con este cambio, las solicitudes se proxy a la URL correcta (por ejemplo, http://app1/test).

    Si esto no resuelve el problema, es posible que haya otro problema con la configuración o la instalación del proyecto. Puede ser necesario realizar más solución de problemas para determinar la causa raíz del problema.

Comments are closed.