1つの静的ファイルを除く、Nginxからのすべてのリクエストをバックエンドにプロキシする

1つの静的ファイルを除く、Nginxからのすべてのリクエストをバックエンドにプロキシする

私はバックエンド API をリバース プロキシするために Nginx を使用しています。ただし、"/" へのリクエストが行われたときに、Nginx が "readme.html" という名前の 1 つの静的ファイルを提供するようにしたいと思います。

私は徹底的に調査しました。最も有望な解決策は次のとおりでした。https://stackoverflow.com/a/15467555/2237433

このソリューションを自分のケースに適用しようとして、次のコードを作成しました。私の Dockerfile は次のとおりです。

# syntax=docker/dockerfile:1
FROM nginx:1.22.0-alpine
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./readme.html /www/
EXPOSE 80

Nginx コンテナを実行している状態で、シェルに接続して実行し、cat /www/readme.htmlファイルが実際に存在するかどうかを確認できます。

これが私の nginx.conf です:

# a lot of stuff
http {
    # a lot of stuff
    proxy_cache_path  /data/nginx/cache keys_zone=my-zone:10m;
    server {

        listen 80;
        add_header X-Cache-Status $upstream_cache_status always;

        location / {
            root /www/;
            try_files readme.html @backend;
        }

        location @backend {
            proxy_pass http://api:8080;
            proxy_cache my-zone;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
            proxy_cache_lock on;
        }

    }
}

この設定では、すべてのパスが期待どおりに動作しますが、"/" でリクエストを実行すると 404 エラーが発生します。404 は実際にはバックエンドから来ています。リクエスト後のバックエンドからのログは次のとおりです。

[20/Jun/2022 01:51:06] "GET / HTTP/1.0" 404 -

したがって、「/」リクエストは実際にはバックエンドに渡されました。

その設定からさまざまな調整を試しましたが、効果はありませんでした。ご協力ありがとうございました!

答え1

「ルート」リクエスト URI を明示的に書き換えることができます。

location = / {
    root /www;
    rewrite ^ /readme.html break;
}
location / {
    proxy_pass http://api:8080;
    ...
}

readme.htmlまたは、インデックス ファイルとして使用することもできます:

location / {
    root /www;
    index readme.html;
    try_files $uri $uri/ @backend;
}

答え2

location /有効な解決策を見つけました。ブロックは次のようになることがわかりました。

location / {
    root /www;
    try_files $uri/readme.html @backend;
}

ただ、その理由を本当に理解しているとは言えないので、誰かがその理由を説明してくれるとありがたいです。

関連情報