Nginx

NGINX:docker容器中帶有proxy_pass的try_files

  • February 2, 2022

我使用 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. 我需要的是檢查請求的文件是否在我的應用程序中可用。

那麼類似的東西可能嗎?但這不起作用:-(


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

你不能在 nginx 中實現這樣的遠端檢查。即使可以,它也會很慢,因為 nginx 需要發出兩個請求來服務一個文件。

首選的解決方案是將資產複製/共享到 nginx 可以訪問它們的地方。

另一種解決方案是在您的應用程序中實現邏輯,它檢查文件副檔名並相應地提供文件。proxy_pass那麼前端nginx一個簡單的就夠了。

第三種選擇是將 nginx 也包含在應用程序容器中。proxy_pass在這種情況下,可以在前端使用一個簡單的 nginx。

引用自:https://serverfault.com/questions/1092369