Nginx 静的サービス設定の詳細な説明 (ルートとエイリアスの指示)

Nginx 静的サービス設定の詳細な説明 (ルートとエイリアスの指示)

静的ファイル

Nginx は高いパフォーマンスで知られており、フロントエンドのリバース プロキシ サーバーとしてよく使用されます。同時に、nginx は高性能な静的ファイル サーバーでもあります。通常、nginx はアプリケーションの静的ファイルを処理するために使用されます。

nginx の静的ファイルを構成するディレクティブは、ルートとエイリアスの 2 つあります。これら 2 つの命令では、パスの後にスラッシュを追加するかどうかが混乱することがよくあります。この記事では、さまざまな一致ルールを試して、より一般的な構成方法をまとめます。

基本設定

記事「Nginx Location Url」のロケーション URL 構成に関する実験と同様に、この記事でも Vagrant 仮想マシンで nginx を使用します。基本的な構成は次のとおりです。

/etc/nginx/sites-enabled/pro.conf

サーバー{
    80 default_server をリッスンします。


    server_name ローカルホスト;

    アクセスログ /var/log/nginx/pro/access.log;
    error_log /var/log/nginx/pro/error.log;

    エラーページ 404 /404.html;

    ルート /vagrant/pro;
    インデックス index.html index.htm;
}

プロジェクトディレクトリは次のとおりです。

プロツリー
。
├── 403.html
├── 404.html
├──index.html
├── 静的
│ ├── フラスコ
│ │ └── m.png
│ └── stc.jpg
└──アップロード
  └── アップ.png

3 つのディレクトリ、6 つのファイル

静的フォルダーが 2 つあり、1 つは静的で、もう 1 つはアップロードです。

ルートを知る

root はプロジェクトのルート ディレクトリを指定し、サーバーおよび場所に適用されます。複数の場所を指定できます。場所が指定されていない場合は、サーバーまたは http の場所を使用して場所が継承されます。

upload/2022/web/stc.jpg にアクセスすると、画像が返されていることがわかります。まだ場所を設定していないのに、なぜファイルを正しく見つけることができるのでしょうか?ルートまたはエイリアス ディレクティブを学習する場合、最も良い方法は、ファイルがハードディスク上に存在しないようにファイル拡張子に文字を追加することです。 そうすると、nginx の error.log から nginx がファイルを見つける方法を確認できます。

upload/2022/web/stc.jpgx にアクセスし、/var/log/nginx/pro/error.log ファイルを確認すると、次のエラー情報が表示されます。

2016/09/28 07:41:48 [エラー] 4416#0: *70 open() "/vagrant/pro/static/stc.jpgx" が失敗しました (2: そのようなファイルまたはディレクトリはありません)、クライアント: 192.168.33.1、サーバー: localhost、リクエスト: "GET /static/stc.jpgx HTTP/1.1"、ホスト: "192.168.33.10"

つまり、/vagrant/pro/static/stc.jpgx ファイルは存在しません。確かに、このファイルはありません。ファイル名が正しければアクセスできます。これは、サーバーに root /vagrant/pro が指定されているため、nginx はこのディレクトリでファイルを検索しており、URL 上のアドレスはファイルのパスとまったく同じであるためです。

 http://192.168.33.10 /static/stc.jpg 
 /vagrant/pro /static/stc.jpg

このことから、nginx のルート ディレクティブのアドレスが、一致した URL 内のホストを実際に置き換えることが推測できます。

ルートディレクティブ

上記の推測を検証するには、実験のための場所をさらにいくつか記述する必要があります。次のように場所の構成を追加します。

場所 ^~ /static {
  ルート /vagrant/pro/static;
}

再度 upload/2022/web/stc.jpg にアクセスすると、画像が表示できないことがわかります。error.log を確認すると、結果は次のようになります。

2016/09/28 07:48:57 [エラー] 5978#0: *71 open() "/vagrant/pro/static/static/stc.jpg" が失敗しました (2: そのようなファイルまたはディレクトリはありません)、クライアント: 192.168.33.1、サーバー: localhost、リクエスト: "GET /static/stc.jpg HTTP/1.1"、ホスト: "192.168.33.10"

nginx は、アドレスを /vargrant/pro/static/static/stc.jpg と追加の static として認識します。上記のルールを適用すると、組み合わせは 192.168.33.10 == /vagrant/pro/static となり、URL は /static/stc.jpg になります。置換により、/vagrant/pro/static + /static/stc.jpg が取得できます。エラーと同じです。解決策は、ルート内の静的ファイルを削除することです。そうすれば、すぐにイメージにアクセスできます。

もしそうなら、static フォルダーに stc という名前を付けると、結果はどうなるでしょうか?

場所 ^~ /static {
  ルート /vagrant/pro;
}

upload/2022/web/stc.jpg にアクセスすると、次のエラーが発生します。

2016/09/28 07:54:46 [エラー] 5992#0: *73 open() "/vagrant/pro/static/stc.jpg" が失敗しました (2: そのようなファイルまたはディレクトリはありません)、クライアント: 192.168.33.1、サーバー: localhost、リクエスト: "GET /static/stc.jpg HTTP/1.1"、ホスト: "192.168.33.10"

パス /vagrant/pro + /static/stc.jpg を計算します。/vagrant/pro/static/stc.jpg ファイルが見つかりません。これは上記のルールを満たしています。場所を変更してみてください:

場所 ^~ /stc {
  ルート /vagrant/pro;
}

URL が変更されたため、upload/2022/web/stc.jpg にアクセスすると画像が見つかります。ここで、stc フォルダーを static に戻します。

スラッシュ付きルート

パスの最後にスラッシュ / を追加する必要があるかどうか疑問に思う人が多いのではないでしょうか。 location の static の後のスラッシュは、一致した URL に関連しているため、詳細には説明しません。ルートのパス内のスラッシュ / は実験によって決定できます。場所を次のように設定します。

場所 ^~ /static/ {
  ルート /vagrant/pro/;
}

upload/2022/web/stc.jpg にアクセスします。すべて正常です。 upload/2022/web/stc.jpg にアクセスします。エラーは、「/vagrant/pro/static/stc.jpgs」ファイルが見つからないことです。

ホストをルートに置き換えるルールに従う場合、置き換えプロセスは次のようになります。

/vagrant/pro/ + /static/stc.jpg == /vagrant/pro//static/stc.jpg です。 *nix システムでは、複数のスラッシュと単一のスラッシュは同等です。つまり、/vagrant/pro//static/stc.jpg は /vagrant/pro/static/stc.jpg と同じです。

このように、ルートパスの後にスラッシュがあってもなくても効果は同じです。この場合、誰かが間違いなくこの構成を思いつくでしょう:

場所 ^~ 静的/ {
  ルート /vagrant/pro;
}

インストール前に上記のアルゴリズムを使用すると、/vagrant/pro + static/stc.jpg となり、合計は /vagrant/prostatic/stc.jpg になります。これは間違っているはずですが、実際には画像にアクセスできます。何か変ですか?
前の記事でnginx locationのURLマッチングルールを理解していれば、^~ static/は一致しないことがわかるはずです。場所を変更

場所 ^~ 静的/ {
  書き換え^ http://google.com;
  # ルート /vagrant/pro;
}

upload/2022/web/stc.jpg にアクセスすれば、引き続き画像を取得できます。Google へのジャンプはありません。つまり、一致する ^~ static/ はありません。

実際、原理は非常に単純です。最初の実験を思い出してください。場所を設定していなかったときでも、画像を返すことができました。そうです。^~ static/ は一致しませんが、外側のサーバーではルートを /vagrant/pro と定義しているので、イメージの検索は正常に返ってきます。その後、外側のルートをコメントアウトして再度アクセスします。この時点で 404 エラーが発生します。次のようにエラーを確認してください。

2016/09/28 08:18:15 [エラー] 6227#0: *82 open() "/usr/share/nginx/html/static/stc.jpg" が失敗しました (2: そのようなファイルまたはディレクトリはありません)、クライアント: 192.168.33.1、サーバー: localhost、リクエスト: "GET /static/stc.jpg HTTP/1.1"、ホスト: "192.168.33.10"

/usr/share/nginx/html/static/stc.jpg は、ルートが指定されていない場合でも、nginx にはデフォルトでルート (/usr/share/nginx/html) があることを意味します。もちろん、この設定は ^~ static/ とは何の関係もありません。

~static/stc.jpgs? が見つかれば結果は正しいです。そのため、画像にアクセスしても正しく解析できません。そのため、/vagrant/pro + static/stc.jpg のような状況は発生しません。ここで理解する鍵は、ホストをルートに置き換え、一致する URL を追加することです。一致する URL にはもちろん先頭のスラッシュが含まれますが、一致する URL 部分には含まれません。
~static/stc.jpgs? モードの場合は、urlupload/2022/web/stc.jpg にアクセスします。

  • 一致した URL は /static/stc.jpg です
  • URLの一致する部分はstatic/stc.jpgです

これは、後のエイリアスコマンドとスラッシュの関係に直接関係するため、これをマスターすることは非常に重要です。

ルートディレクティブについては、要約できます。

  1. 一致した URL アドレスについては、一致した場所のルート パスをアクセス URL のホストに置き換えて、ファイルの実際のアドレスを取得します。 (複数のスラッシュは 1 つのスラッシュと同等です)
  2. 場所が一致しない場合は、外側のレベルでルートを探して置き換えます。
  3. ルート ディレクティブの末尾のスラッシュ マークはオプションです。

エイリアスディレクティブ

ルートの場合、操作は非常に簡単です。ルート アドレスを、ファイルのハード ディスク パス (実アドレス) であるホストに置き換えるだけです。 alise の場合、一致した URL アドレスは置き換えられませんが、URL の一致した部分が置き換えられます。エイリアス ディレクティブは複数存在できます。
場所の追加はルートの追加とほぼ同じです。

場所 ^~ /アップロード {
  エイリアス /vagrant/pro;
}

upload/2022/web/up.png にアクセスしても画像がありません。エラーを確認すると、次のメッセージが表示されます。

2016/09/28 08:36:18 [エラー] 6312#0: *90 open() "/vagrant/pro/up.png" が失敗しました (2: そのようなファイルまたはディレクトリはありません)、クライアント: 192.168.33.1、サーバー: localhost、リクエスト: "GET /upload/up.png HTTP/1.1"、ホスト: "192.168.33.10"

エイリアスパターンは /vagrant/pro + /upload/up.png ではなく、 /vagrant/pro + /up.png であることがわかります。

エイリアスという言葉は、コンピューターで非常によく使われます。その文字通りの意味は「別名」です。名前が示すように、名前を変更することを意味します。実際の置換ルールは、一致する URL アドレスをエイリアス内のパスに置き換えることです。たとえば、上記の例の置換プロセスは次のようにシミュレートできます。

プロセスパターンまたはURL
URLパターン^~ /アップロード
エイリアスパス/vagrant/プロ
アクセスアドレスアップロード/2022/web/up.png
住所の一致する部分/アップロード + /up.png
交換する/アップロード == /vagrant/pro
結果/vagrant/pro + /up.png

画像へのアクセスを変更するには、次のように場所を変更します。

場所 ^~ /アップロード {
  エイリアス /vagrant/pro/upload;
}

現時点では、upload/2022/web/up.png にアクセスすると正しい画像を取得できます。上記の計算プロセスは次のとおりです。

プロセスパターンまたはURL
URLパターン^~ /アップロード
エイリアスパス/vagrant/pro/アップロード
アクセスアドレスアップロード/2022/web/up.png
住所の一致する部分/アップロード + /up.png
交換する/アップロード == /vagrant/pro/アップロード
結果/vagrant/pro/upload + /up.png

結果から、ファイル パスが正しく検出されたことがわかります。エイリアス命令パスにスラッシュを追加すると、計算されたファイル パスは次のようになります。

/アップロード == /vagrant/pro/アップロード
/vagrant/pro/upload/ + /up.png

複数のスラッシュは有効です。スラッシュが 1 つの場合と同じです。

場所を次のように変更します。

場所 ^~ /upload/ {
  エイリアス /vagrant/pro/upload;
}

一致する URL は /upload/ + up.jpg となり、置換の結果は /vagrant/pro/upload + up.png となります。ただし、パス /vagrant/pro/uploadup.png は不正です。置換エラーは、次のエラーからも確認できます。

2016/09/28 08:52:44 [エラー] 6452#0: *92 open() "/vagrant/pro/uploadup.png" が失敗しました (2: そのようなファイルまたはディレクトリはありません)、クライアント: 192.168.33.1、サーバー: localhost、リクエスト: "GET /upload/up.png HTTP/1.1"、ホスト: "192.168.33.10"

解決策も非常に簡単で、/vagrant/pro/upload を /vagrant/pro/upload/ に変更するだけです。 alias の末尾のスラッシュは、root ディレクティブのように必須ではないことがわかります。必要かどうかは、場所の URL 一致パターンによって異なります。

以前のルートモードでは、ルートのないスラッシュの場合 (~ static/stc.jpgs?) が考慮されていました。エイリアスの場合はエラーをキャッチするのが困難でした。場所が次のように構成されている場合:

場所 ^~ アップロード/ {
   エイリアス /vagrant/pro/upload/;
}

置換ファイルのパスは /vagrant/pro/upload/up.png である必要がありますが、実際のテストでは、この方法でエイリアスを構成すると常に 301 リダイレクトが発生します。エイリアス ディレクトリで自動インデックスが有効になっていない場合、403 エラーがスローされます。具体的な状況はまだわかっておらず、nginx のバグなのかどうかもわかりません。この状況を回避するには、エイリアスを使用するときに、場所を ^~ upload/ モードとして設定しないようにし、ルートから URL を指定しないようにしてください。そうしないと、場違いに見えてしまいます。

alise をルートではなくエイリアスとして使用する大きな利点は、alise はホストを置き換えるのではなく、ホストの一致する部分を置き換えるため、URL 上のパスが必ずしもファイル パスと同じである必要がないことです。次のように構成を変更します。

場所 ^~ /upload/ {
  エイリアス /vagrant/pro/static/;
}

upload/2022/web/stc.jpg または upload/2022/web/m.png にアクセスすると、URL が upload であっても、静的ディレクトリ内のファイルに正しくアクセスできます。

置換ルールも単純で、/upload/ == /vagrant/pro/static/ は /vagrant/pro/static/ + stc.jpg または /vagrant/pro/static/ + flask/m.png を取得します。

要約する

nginx の静的ファイル設定では、ルート ディレクティブとエイリアス ディレクティブの両方を実装できます。混乱を避けるために、ルート パスのない URL パターンを記述しないようにしてください。つまり、static/ で始まらないようにしてください。ルート パスのスラッシュは保持する必要があります。ルート パスがないのは奇妙です。

ルートとエイリアスの違いは、置換部分にあります。ルート モードでは、ルートによって設定されたパスが、一致した URL 内のホストを置き換えます。エイリアスは、URL の一致する部分を指定したパスに置き換えます。コマンド内のスラッシュはルート コマンドには影響しません。alise の場合は、置換ルールに従って一致させることができます。

ルートディレクティブ

場所 /dir/ 
ルート ルートパス -> http://host/dir/file.txt -> ルートパス/dir/file.txt

エイリアスディレクティブ

場所 /dir
エイリアス alias_path -> http://host /dir /file.txt -> alias_path/file.txt

場所 /dir/ 
エイリアス alias_path/ -> http://host /dir/ file.txt -> alias_path/file.txt

ルートとエイリアスを理解した後は、通常はプロジェクトのルートを設定し、他のフォルダーにはエイリアスを使用するのが最適です。結局のところ、エイリアスの方が柔軟性が高いのです。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nginx 設定におけるルートとエイリアスのディレクティブの違いの簡単な分析
  • Nginx のルートとエイリアス ファイル パスおよびインデックス ディレクトリ構成の詳細な説明
  • nginx php-fpm環境でchroot機能を設定して使用する方法
  • Nginx エイリアスでの PHP (FastCGI) の 404 エラーの解決方法
  • Nginx、Apache のエイリアスと認証機能

<<:  CentOS 7 で rpm パッケージを使用して MySQL 5.7.18 をインストールする

>>:  フックを使用して React コンポーネントを書くときに注意すべき 5 つの点

推薦する

動的テーブルを実装するための要素サンプルコード

目次【コード背景】 【コード実装】 #1# -> コード再利用の基本は、再利用可能なコンポーネ...

uniappがインターフェースドメイン名を動的に取得する方法を分析する

背景インターフェイス ドメイン名はハードコードされておらず、動的に取得されます。具体的な実装は、静的...

フレックスレイアウトは、1行あたりの固定行数と適応レイアウトを実現します。

この記事では、1行あたりの固定行数+アダプティブレイアウトを実現するフレックスレイアウトを紹介し、皆...

Linux システムで Tomcat を自動的に起動するための設定方法の紹介

1. /etc/init.d ディレクトリに入ります: cd /etc/init.d 2. tomc...

MySQLを監視するためのbinlogログ解析ツールの詳しい説明:Canal

Canal は、Java を使用して開発された Alibaba のオープンソース プロジェクトです...

CSS で高さが不明な垂直中央揃えを実装する

この記事では主に、高さが不明な垂直方向の中央揃えを CSS で実装する方法を紹介し、皆さんと共有しま...

iframe ページパラメータの文字化けの問題について議論

非常に珍しいパラメータ文字化けの問題に遭遇しました。まずページを見てみましょう写真に示すように、月次...

1つの記事でJavaScript DOM操作の基本を学ぶ

DOM の概念DOM: ドキュメント オブジェクト モデル: ドキュメント オブジェクト モデルは、...

CSS の 4 つのインポート方法と優先順位の簡単な分析

第一に: CSSを導入する4つの方法CSS を導入する方法には、インライン スタイル、埋め込みスタイ...

メタを使用してトラフィックキャッシュをキャンセルし、ページにアクセスするたびにページを更新して簡単にデバッグできるようにします。

コードをコピーコードは次のとおりです。 <!-- ブラウザがローカル キャッシュからページにア...

mysql8.0.11 winx64 インストールと設定のチュートリアル

mysql 8.0.11 winx64のインストールチュートリアルは以下のように記録され、みんなと共...

MySQL におけるデータベース間関連クエリメソッド

ビジネスシナリオ: 異なるデータベース内のテーブルをクエリするたとえば、関連付けられるテーブルは、マ...

MySQL 最適化における B ツリー インデックスの知識ポイントのまとめ

SQL を最適化する必要があるのはなぜですか?当然ですが、SQL ステートメントを記述する場合、次の...

JavaScript 文字列オブジェクトメソッド

目次文字列オブジェクトのメソッド方法 1: indexOf() (推奨)方法 2: search()...

HTML テーブルタグチュートリアル (20): 行の背景色属性 BGCOLOR

BGCOLOR 属性を使用して、行の背景色を設定できます。基本的な構文<TR BGcolor...