Nginx
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_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
. 我需要的是檢查請求的文件是否在我的應用程序中可用。那麼類似的東西可能嗎?但這不起作用:-(
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。