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?
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:
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:
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.