múltiple Aplicaciones Vue en docker nginx - no puede reescribir la ruta raíz de ubicación
Trato de servir dos aplicaciones Vue en contenedores vía docker nginx. El problema es - si pongo raíz para cada ubicación como este, tengo 404 en las urls de GET.
server {
listen 80;
server_name localhost;
location /backend/api {
proxy_pass http://backend-diagnostics/api;
}
location ^~ /constructor {
root /client/constructor;
index index.html;
try_files $uri /index.html;
}
location ^~ /viewer {
root /client/viewer;
index index.html;
try_files $uri /index.html;
}
}
nginx tiene un registro: "[error] 28#28: *3 open() "/etc/nginx/html/index.html" failed (2: No such file or directory)"
Si agrego raíz al bloque servidor, así
server {
listen 80;
server_name localhost;
root /client/constructor;
index index.html;
location /backend/api {
proxy_pass http://backend-diagnostics/api;
}
location ^~ /constructor {
root /client/constructor;
index index.html;
try_files $uri /index.html;
}
location ^~ /viewer {
root /client/viewer;
index index.html;
try_files $uri /index.html;
}
}
la aplicación del constructor comienza a funcionar, pero si consigo localhost/viewer
Tengo resultado como si estuviera tratando de conseguir localhost/constructor
.
Si pongo la ubicación como esta
location /viewer {...}
la solicitud devuelve página en blanco. La fuente incluye texto We're sorry but constructor-client doesn't work properly without JavaScript enabled. Please enable it to continue.
archivo de compostura de Docker, si es necesario
version: "3"
services:
backend-diagnostics:
build: ./backend
command: bash -c "pm2-runtime start app.js"
env_file: ./backend/.env.staging
ports:
- 8080:80
# expose:
# - 80
constructor-client:
build: ./constructor-client
command: bash -c "cp -r /app/dist/* /dist/"
# ports:
# - 8081:80
volumes:
- ./client/constructor:/dist
viewer:
build: ./viewer-client
command: bash -c "cp -r /app/dist/* /dist/"
# ports:
# - 8082:8082
volumes:
- ./client/viewer:/dist
nginx:
build: ./nginx
ports:
- 80:80
- 443:443
links:
- backend-diagnostics
# - constructor-client
# - viewer
volumes:
- ./client/constructor:/client/constructor
- ./client/viewer:/client/viewer
Pregunta hecha hace 3 años, 4 meses, 28 días - Por codealchemy
2 Respuestas:
-
El problema que estás experimentando puede estar relacionado con la configuración de raíz y ubicaciones en tu archivo de configuración de Nginx. Vamos a abordar cada parte del problema para intentar resolverlo:
- Configuración inicial de Nginx:
- Problema con la configuración raíz:
- Solución sugerida:
En esta configuración:nginx server { listen 80; server_name localhost; location /backend/api { proxy_pass http://backend-diagnostics/api; } location /constructor { alias /client/constructor; try_files $uri /constructor/index.html; } location /viewer { alias /client/viewer; try_files $uri /viewer/index.html; } }
- Usamos la directiva `alias` en lugar de `root` dentro de las ubicaciones para especificar la ruta real de los archivos estáticos.
- Utilizamos `try_files` para intentar servir los archivos estáticos de la aplicación.
- Asegúrate de que las rutas especificadas en `alias` coincidan con las que mapeas en tus contenedores Docker.
Prueba con esta configuración para ver si resuelve el problema que estás experimentando. No dudes en hacer preguntas si necesitas más ayuda.
Respondida el Dec 19, 2020 a las 11:14 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Parece que el problema en tu configuración de Nginx es cómo estás dirigiendo las solicitudes a tus diferentes aplicaciones Vue alojadas en contenedores Docker. Aquí tienes algunos puntos que debes tener en cuenta:
Problema con la configuración de la raíz:
En tu configuración inicial, estás asignando la raíz
/client/constructor
al bloque del servidor, lo que hará que todas las solicitudes se dirijan a la aplicaciónconstructor
. Para servir varias aplicaciones, debes configurar ubicaciones independientes con sus propias raíces:nginx server { listen 80; server_name localhost; location /backend/api { proxy_pass http://backend-diagnostics/api; } location /constructor { root /client/constructor; index index.html; try_files $uri /index.html; } location /viewer { root /client/viewer; index index.html; try_files $uri /index.html; } }
Ruta raíz:
Es importante tener una ruta raíz (generalmente
/
) para cada ubicación para manejar las solicitudes de la página de inicio. En tu configuración inicial, no tenías rutas raíz configuradas para tus ubicaciones/constructor
y/viewer
. Asegúrate de incluir la barra diagonal inicial en tus rutas raíz:nginx location /constructor { ... } location /viewer { ... }
Configuración de enlace:
En tu archivo
docker-compose.yml
, tienesnginx
configurado para enlazarse solo con el serviciobackend-diagnostics
. Esto significa que Nginx no tiene conocimiento de tus serviciosconstructor-client
yviewer
. Debes agregar los serviciosconstructor-client
yviewer
a la lista de enlaces para que Nginx pueda comunicarse con ellos:nginx: ... links:
- backend-diagnostics
- constructor-client
- viewer
Consideraciones adicionales:
Asegúrate de que los puertos expuestos por tus servicios
constructor-client
yviewer
estén configurados correctamente en el archivodocker-compose.yml
. Verifica que tus aplicaciones Vue estén construyéndose y ejecutándose correctamente en sus respectivos contenedores.- Comprueba los registros de Nginx y Docker para ver si hay mensajes de error o advertencias que puedan proporcionar información adicional.
Después de realizar estos cambios y reiniciar tus contenedores Docker, deberías poder acceder a tus dos aplicaciones Vue en
http://localhost/constructor
yhttp://localhost/viewer
.Respondida el Dec 19, 2020 a las 11:19 - por Gemini
Votos positivos: 0 | Votos negativos: 0