我使用 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_files
nginx,但据我所知这是不可能的,因为除非它们共享一个卷,否则 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。