localhost:3000で実行されているNode.jsアプリケーションのリバースプロキシとしてnginxを使用しています。nginx自体と私のアプリケーションはどちらも2つの別々のDockerコンテナです。(後でアプリを追加する予定なので、別にしてください。)

私のアプリコンテナには、いくつかの.webp代替画像があります。例えば

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

nginxで使用try_filesしてみましたが、ボリュームを共有しない限り、try_filesは別のDockerコンテナー内のファイルを「認識」しないため、これは不可能です。彼らはできません。アプリコンテナは、すべてが内部にある別の場所に構築されています。

私が今持っているのはこれです:

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;
}
answer

このようなリモートチェックをnginxに実装することはできません。また、可能であっても、nginxが1つのファイルを提供するために2つのリクエストを行う必要があるため、処理が遅くなります。

推奨される解決策は、nginxがアセットにアクセスできる場所にアセットをコピー/共有することです。

もう1つの解決策は、アプリケーションにロジックを実装することです。これにより、ファイル拡張子がチェックされ、それに応じてファイルが提供されます。次に、proxy_passフロントエンドnginxでは単純なもので十分です。

3番目のオプションは、アプリコンテナにもnginxを含めることです。この場合、simpleproxy_passをフロントエンドnginxで使用できます。