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 つの点

推薦する

IEの送信フォームの記録履歴クリックリターン情報を実現するためのCSSスタイルコントロールはまだ残っています

これは主に CSS スタイルのコントロールと META タグです。コードをコピーコードは次のとおりで...

CentOSにPHP+Apache+MySQLのサーバー環境をインストールして構築する

Yum (フルネームは Yellow dog Updater, Modified) は、Fedora...

Vueカスタムテーブル列実装プロセス記録

目次序文レンダリングsetTable コンポーネント使用結論序文フォームを使用して PC 側のプロジ...

Linux で ss コマンドと zabbix を組み合わせてソケットを監視する方法の詳細な説明

目次序文1. ssコマンド2. Zabbix監視マシンの全体的なソケットステータス2.1. スクリプ...

幅と高さが可変の要素を中央に配置するための CSS ソリューション

1. 水平中央公開コード: html: <div class="parent&quo...

Node.js でメモリ効率の高いアプリケーションを作成する方法

目次序文問題: 大きなファイルのコピーNodeJS のストリームとバッファバッファストリーム解決策 ...

HTML シンプルな Web フォーム作成例の紹介

<input> はユーザー情報を収集するために使用され、終了ステートメントはありません。...

HTML フォームタグチュートリアル (3): 入力タグ

HTML フォーム タグのチュートリアル。このセクションでは、主に Web ページで INPUT タ...

MySQLでJSONフィールドを操作する方法

MySQL 5.7.8 では json フィールドが導入されました。このタイプのフィールドは使用頻度...

CSS3はトランジション効果を実現するためにtransitionプロパティを使用する。

物件の詳細な説明transition 属性の目的は、一部の CSS プロパティ (背景など) をスム...

MySQLの外部ネットワークアクセス権を開く方法

以下のように表示されます。主に認証コマンドを実行します: 2つの方法1. 任意のホストがユーザー b...

JS でオブジェクトが空オブジェクトかどうかを判断する 5 つの方法

1. jsonオブジェクトをjson文字列に変換し、文字列が「{}」であるかどうかを判断します。 v...

Mysql を 5.7 にアップグレードした後のグループ クエリの問題を解決する

問題を見つける最近MySQLをMySQL 5.7にアップグレードした後、次のようなクエリでグループ化...

VMware マルチノード環境を構成する方法

このチュートリアルでは CentOS 7 64 ビットを使用します。各仮想マシンに 2GB のメモリ...

カルーセル例の JS 実装

この記事では、カルーセルチャートの小さなケースを実装するためのJSの具体的なコードを参考までに共有し...