Nginx —ルートとエイリアスとの混乱をもたらす静的ファイル


473

のアプリサーバーを通じてアプリを提供し、アプリサーバーに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それが再び動作を開始します。

誰かが何が起こっているのか説明できますか?また、間の違いが何であるかはっきりと冗長に説明してくださいrootalias、そしてその目的は。

回答:


1074

私は混乱の答えを見つけました。

rootaliasディレクティブの間には非常に重要な違いがあります。この違いは、rootまたはで指定されたパスのalias処理方法に存在します。

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

説明する:

設定があるとしましょう

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

この場合、Nginxが導出する最終的なパスは

/var/www/app/static/static

404にはないので、これは戻ってきstatic/ますstatic/

これは、ロケーションパーツがで指定されたパスに追加されるため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ディレクティブの末尾のスラッシュの場合

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

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

/server/376162/how-can-i-create-a-location-in-nginx-that-works-with-and-without-a-trailing-slas

/server/375602/why-is-my-nginx-alias-not-working


97
エイリアスパスの末尾のスラッシュは必須です!
2015

2
これはすべて素晴らしいですが(構成の問題を修正するのに役立ちました)、この種の問題の診断に役立つログ設定にはどのようなものがあるのでしょうか。同様に、「受信した[...]のリクエスト、[ロケーション[...]」設定ブロック、検索ディレクトリ[...]」などのログに出力されるもの
Pistos

2
@Pistos:入れlog_format scripts '$document_root | $uri | > $request';の中にhttpセクションとaccess_log /var/log/nginx/scripts.log scripts;servernginxの設定..のセクション
helvete

ありがとう!実際、末尾のスラッシュはエイリアスに不可欠です。それ以外の場合nginx: [emerg] invalid number of arguments in "alias" directive、が取得され、サーバーは再起動中にダウンしました。
FotisK 2018

@mafrosisなぜそれが不可欠なのですか?
ブルースサン

104

@treecoderのように言う

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

写真は千の言葉に値する

のためにroot

ここに画像の説明を入力してください

のためにalias

ここに画像の説明を入力してください


11
2番目の画像の最初の矢印は「+」にする必要がありますか?
aioobe 2017年

35

あなたのケースでは、ディレクティブの一部が最後のディレクティブの部分と同じであるrootため、ディレクティブを使用できます。$urilocationroot

Nginxのドキュメントもアドバイスしています:
場所がディレクティブの値の最後の部分と一致する場合:

location /images/ {
    alias /data/w3/images/;
}

代わりにrootディレクティブを使用することをお勧めします。

location /images/ {
    root /data/w3;
}

そして、rootディレクティブは、追加します$uriパスに。


2
なぜそれが良いのですか?ドキュメントはどちらも言いません。
HostedMetrics.com 2017

私が目にする利点は、エイリアスを使用するときに、指定された例で$ uri、/ imagesの重複を避けることです
antonbormotov

21

@good_computerの非常に役立つ回答の簡単な補足として、URLのルートをフォルダーに置き換えたかったのですが、それが静的ファイル(パスの一部として保持したい)を含むサブフォルダーと一致した場合のみです。

たとえば、要求されたファイルが/app/jsまたはにある場合は/app/css、を調べます/app/location/public/[that folder]

私はこれを正規表現を使用して動作させました。

 location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ {
     alias /home/user/sites/app/public/$1;
     access_log off;
     expires max;
 }

2
この回答をありがとう。私はこれが3年後であることを知っていますが、エイリアスの使用とルートの使用の間にパフォーマンスやセキュリティのトレードオフがあるかどうかを誰かが説明できますか?
ミナ

1
@Mina可能であればrootを使用することをお勧めします。(ドキュメントwiki.nginx.org/HttpCoreModule#aliasにコメントがあります)
Matthew Wilcoxson '16

これはまさに私がforのためにここに来たものです
alienfromouterspace

6

aliasは要求パスのロケーションパーツパス(LPP)を置き換えるためにroot使用され、は要求パスの前に付加するために使用されます。

これらは、リクエストパスを最終的なファイルパスにマップする2つの方法です。

aliasロケーションブロックでのみ使用でき、外側をオーバーライドしますroot

aliasまたroot、ロケーションブロックで一緒に使用することはできません。


3
server {
    server_name xyz.com;
    root /home/ubuntu/project_folder/;

    client_max_body_size 10M;
    access_log  /var/log/nginx/project.access.log;
    error_log  /var/log/nginx/project.error.log;

    location /static {
        index index.html;
    }

    location /media {
        alias /home/ubuntu/project/media/;
    }
}

nginxで静的ページをライブにするサーバーブロック。


2

言い換えると、この概要を維持する上で:の場合、root指定された場所の引数は、ファイルシステムのパスとURIの一部です。一方alias、場所ステートメントのディレクティブ引数はURIの一部のみです

したがって、aliasは、特定のURIをファイルシステムの特定のパスにマップする別の名前ですが、ディレクティブrootへの引数として指定されたルートパスに場所引数を追加しますroot

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.