1. ホーム
  2. nginx

[解決済み] Nginx -- rootとaliasによる静的ファイル提供の混乱

2022-03-17 01:07:28

質問

にあるアプリサーバーを通じてアプリを提供する必要があります。 8080 そして、アプリサーバに触れることなく、ディレクトリから静的ファイルを作成します。nginxの設定は以下のような感じです。

    # app server on port 8080
    # nginx listens on port 8123
    server {
            listen          8123;
            access_log      off;

            location /static/ {
                    # root /var/www/app/static/;
                    alias /var/www/app/static/;
                    autoindex off;
            }


            location / {
                    proxy_pass              http://127.0.0.1:8080;
                    proxy_set_header        Host             $host;
                    proxy_set_header        X-Real-IP        $remote_addr;
                    proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
            }
    }

さて、この構成で、すべてがうまくいっています。ただし root ディレクティブはコメントアウトされています。

を有効にすると root を無効化し alias -- 動作しなくなる。しかし、末尾の /static/ から root を実行すると、再び動作し始めます。

どなたか説明してください。また、以下の2つの違いは何なのか、はっきりと冗長に説明してください。 rootalias とその目的について説明します。

どのように解決するのですか?

とは非常に重要な違いがあります。 rootalias ディレクティブを使用します。この違いは root または alias が処理されます。

の場合は root ディレクティブを使用します。 にフルパスが追加されます。 ロケーション部分を含む 一方 alias ディレクティブを使用します。 の部分のみ、パス ロケーション部分を含まない がエイリアスに追加されます。 .

例えるなら

例えば、次のようなコンフィグがあるとします。

location /static/ {
    root /var/www/app/static/;
    autoindex off;
}

この場合、Nginxが導き出す最終的なパスは次のようになります。

/var/www/app/static/static

これは 404 は存在しないので static/ 内の static/

で指定されたパスに、location の部分が付加されるからです。 root . したがって root であり、正しい方法は

location /static/ {
    root /var/www/app/;
    autoindex off;
}

一方 alias の場合、位置の部分には ドロップ . そのため、コンフィグには

location /static/ {
    alias /var/www/app/static/;
    autoindex off;           ↑
}                            |
                             pay attention to this trailing slash

とすると、最終的なパスは正しく

/var/www/app/static

ある意味、これは理にかなっている。その alias は、既存の "real"パスを表すために新しいパスを定義することができます。位置の部分はその新しいパスなので、実際のパスに置き換えられるのです。シンボリックリンクのようなものだと考えてください。

一方、ルートは新しいパスではなく、いくつかの情報を含んでおり、それを他の情報と照合して最終的なパスを作成する必要があります。そのため、位置の部分は削除されずに使用されます。

の末尾にスラッシュを付けるケースは alias

について、末尾のスラッシュが必須であるかどうかについての明確なガイドラインはありません。 Nginxのドキュメント しかし、ここや他の場所での人々の一般的な観察によると、そうであるようです。

この他にもいくつかの場所で議論されていますが、決定的なものではありません。

https://serverfault.com/questions/376162/how-can-i-create-a-location-in-nginx-that-works-with-and-without-a-trailing-slas

https://serverfault.com/questions/375602/why-is-my-nginx-alias-not-working