NGINX:docker 容器中使用 proxy_pass 的 try_files

NGINX:docker 容器中使用 proxy_pass 的 try_files

我使用 nginx 作为在 localhost:3000 上运行的 Node.js 应用程序的反向代理。nginx 本身和我的应用程序都是两个独立的 docker 容器。(之所以分开,是因为我计划稍后向其中添加更多应用程序。)

在我的应用程序容器中我有一些.webp替代图像。例如

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

我尝试过使用try_filesnginx,但据我所知这是不可能的,因为除非它们共享一个卷,否则 try_files 不会“看到”另一个 docker 容器中的我的文件。它们不能。App 容器是在其他地方构建的,里面有所有内容。

我现在有的是:

upstream app {
  server localhost:3000;
}

[...]

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

[...]

location / {
  proxy_pass http://app;
}

这实际上是可行的。客户端请求.jpg图像并获取.jpg.webp(因为他可以处理它)。问题是他总是获取.jpg.webp。我需要一些 if 来检查所请求的文件是否在我的应用程序中可用。

那么也许有类似的东西吗?但这不起作用 :-(


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

答案1

您无法在 nginx 中实现此类远程检查。即使可以,速度也会很慢,因为 nginx 需要发出两个请求才能提供一个文件。

首选解决方案是将资产复制/共享到 nginx 可以访问的地方。

另一个解决方案是在您的应用程序中实现逻辑,该逻辑检查文件扩展名并相应地提供文件。那么proxy_pass在前端 nginx 中一个简单的就足够了。

第三个选项是将 nginx 也包含在应用程序容器中。在这种情况下,proxy_pass可以在前端使用简单的 nginx。

相关内容