アプリを のアプリ サーバー経由で提供し8080
、静的ファイルをアプリ サーバーに触れることなくディレクトリから提供する必要があります。
# 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
何が起こっているのか誰か説明してくれませんか?
ベストアンサー1
root
ディレクティブとディレクティブの間には非常に重要な違いがあります。この違いは、 またはで指定されたパスが処理されるalias
方法にあります。root
alias
root
- 部品は部品
location
に追加されますroot
- 最終パス =
root
+location
alias
- 部品は部品
location
に置き換えられる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 /static/ {
alias /var/www/app/static/;
autoindex off; ↑
} |
pay attention to this trailing slash
最終的なパスは次のように正しく形成されます。
/var/www/app/static
ある意味、これは理にかなっています。 は、alias
既存の「実際の」パスを表す新しいパスを定義できるだけです。場所の部分は新しいパスなので、実際のパスに置き換えられます。シンボリックリンクとして考えてください。
一方、ルートは新しいパスではなく、最終的なパスを作成するために他の情報と照合する必要がある情報が含まれています。そのため、場所の部分は削除されずに使用されます。
末尾にスラッシュを付ける理由alias
末尾のスラッシュが必須かどうかについての明確なガイドラインはありません。Nginx ドキュメントしかし、ここや他の場所の人々の共通の観察は、それがそうであることを示しているようです。
これについては他にもいくつかの場所で議論されていますが、決定的なものではありません。
https://serverfault.com/questions/375602/why-is-my-nginx-alias-not-working