私は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
を無効にすると - 動作しなくなります。ただし、root
から末尾の/static/
を削除すると、再び機能し始めます。
何が起こっているのか説明できますか。また、root
とalias
の違い、およびその目的について、明確かつ詳細に説明してください。
私は私の混乱に対する答えを見つけました。
root
ディレクティブとalias
ディレクティブの間には非常に重要な違いがあります。この違いは、root
またはalias
で指定されたパスの処理方法にあります。
root
ディレクティブの場合、フルパスがルートに追加されます ロケーション部分を含む一方、alias
ディレクティブの場合は、パスの一部のみ ロケーション部分を含まない) 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部分はdrops)になります。
location /static/ {
alias /var/www/app/static/;
autoindex off;
}
最終パスは次のように正しく形成されます。
/var/www/app/static
こちらのドキュメントを参照してください。 http://wiki.nginx.org/HttpCoreModule#alias
root
ディレクティブの$uri
部分は最後のlocation
ディレクティブ部分と同じであるため、あなたのケースではroot
ディレクティブを使用できます。
Nginxのドキュメント 同様にアドバイスします:
locationがディレクティブの値の最後の部分と一致する場合:location /images/ { alias /data/w3/images/; }
代わりにrootディレクティブを使用することをお勧めします。
location /images/ { root /data/w3; }
root
ディレクティブはパスに$uri
を追加します。
@ 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;
}
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で静的ページを生きるためのサーバーブロック。
言い換えれば、この簡潔さを保つために:root
の場合、指定されたlocation引数は ファイルシステムのパスとURI の一部です。一方、locationステートメントのalias
ディレクティブ引数は URIのみの一部です
そのため、alias
は特定のURIをファイルシステム内の特定のパスにマッピングする別の名前ですが、root
はroot
ディレクティブの引数として指定されたルートパスにlocation引数を追加します。
alias
はリクエストパスのロケーションパートパス(LPP)を置き換えるために使用され、root
はリクエストパスの先頭に追加されるために使用されます。
リクエストパスを最終ファイルパスにマッピングするには、2つの方法があります。
alias
はlocationブロックでのみ使用でき、外側のroot
をオーバーライドします。
alias
とroot
をロケーションブロックで一緒に使用することはできません。