Uso nginx como proxy inverso para mis aplicaciones Node.js que se ejecutan en localhost:3000. Tanto nginx como mi aplicación son dos contenedores docker separados. (Separado porque más adelante planeo agregarle más aplicaciones).

En mi contenedor de aplicaciones tengo algunas .webpimágenes alternativas. P.ej

$ ls
 
/app/assets/img/image.jpeg
/app/assets/img/image.jpeg.webp
/app/assets/img/other.jpeg

Intenté usar try_filescon nginx pero, que yo sepa, esto no es posible porque try_files no "ve" mis archivos dentro de otro contenedor acoplable a menos que compartan un volumen. Que no pueden. El contenedor de la aplicación está construido en otro lugar con todo dentro.

Lo que tengo ahora mismo es esto:

upstream app {
  server localhost:3000;
}

[...]

location ~* .+\.(jpg|jpeg|svg|png)$ {
  proxy_pass http://app$uri$webp_suffix;
}

[...]

location / {
  proxy_pass http://app;
}

De hecho, esto está funcionando. El cliente pide .jpgimagen y la obtiene .jpg.webp(porque la puede manejar). El problema es que siempre lo consigue .jpg.webp. Lo que necesito es algo para verificar si el archivo solicitado está disponible en mi aplicación.

Entonces, ¿algo similar a esto, tal vez? Pero esto no está funcionando :-(


location ~* .+\.(jpg|jpeg|svg|png)$ {
  if (-f http://app$uri$webp_suffix) {
    proxy_pass http://app$uri$webp_suffix;
  }
  proxy_pass http://app$uri;
}
answer

No puede implementar dicho control remoto en nginx. E incluso si pudiera, sería lento porque nginx necesitaría hacer dos solicitudes para servir un archivo.

La solución preferida es copiar/compartir los activos en un lugar donde nginx pueda acceder a ellos.

Otra solución es implementar la lógica en su aplicación, que verifica las extensiones de los archivos y sirve los archivos en consecuencia. Entonces un simple proxy_passes suficiente en el front-end nginx.

La tercera opción es incluir nginx también en el contenedor de la aplicación. proxy_passEn este caso, se puede usar un simple en el front-end nginx.