静的ファイル 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 ファイルを確認すると、次のエラー情報が表示されます。
つまり、/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 を確認すると、結果は次のようになります。
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 にアクセスすると、次のエラーが発生します。
パス /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 になります。これは間違っているはずですが、実際には画像にアクセスできます。何か変ですか? 場所 ^~ 静的/ { 書き換え^ http://google.com; # ルート /vagrant/pro; } upload/2022/web/stc.jpg にアクセスすれば、引き続き画像を取得できます。Google へのジャンプはありません。つまり、一致する ^~ static/ はありません。 実際、原理は非常に単純です。最初の実験を思い出してください。場所を設定していなかったときでも、画像を返すことができました。そうです。^~ static/ は一致しませんが、外側のサーバーではルートを /vagrant/pro と定義しているので、イメージの検索は正常に返ってきます。その後、外側のルートをコメントアウトして再度アクセスします。この時点で 404 エラーが発生します。次のようにエラーを確認してください。
/usr/share/nginx/html/static/stc.jpg は、ルートが指定されていない場合でも、nginx にはデフォルトでルート (/usr/share/nginx/html) があることを意味します。もちろん、この設定は ^~ static/ とは何の関係もありません。 ~static/stc.jpgs? が見つかれば結果は正しいです。そのため、画像にアクセスしても正しく解析できません。そのため、/vagrant/pro + static/stc.jpg のような状況は発生しません。ここで理解する鍵は、ホストをルートに置き換え、一致する URL を追加することです。一致する URL にはもちろん先頭のスラッシュが含まれますが、一致する URL 部分には含まれません。
これは、後のエイリアスコマンドとスラッシュの関係に直接関係するため、これをマスターすることは非常に重要です。 ルートディレクティブについては、要約できます。
エイリアスディレクティブ ルートの場合、操作は非常に簡単です。ルート アドレスを、ファイルのハード ディスク パス (実アドレス) であるホストに置き換えるだけです。 alise の場合、一致した URL アドレスは置き換えられませんが、URL の一致した部分が置き換えられます。エイリアス ディレクティブは複数存在できます。 場所 ^~ /アップロード { エイリアス /vagrant/pro; } upload/2022/web/up.png にアクセスしても画像がありません。エラーを確認すると、次のメッセージが表示されます。
エイリアスパターンは /vagrant/pro + /upload/up.png ではなく、 /vagrant/pro + /up.png であることがわかります。 エイリアスという言葉は、コンピューターで非常によく使われます。その文字通りの意味は「別名」です。名前が示すように、名前を変更することを意味します。実際の置換ルールは、一致する URL アドレスをエイリアス内のパスに置き換えることです。たとえば、上記の例の置換プロセスは次のようにシミュレートできます。
画像へのアクセスを変更するには、次のように場所を変更します。 場所 ^~ /アップロード { エイリアス /vagrant/pro/upload; } 現時点では、upload/2022/web/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 は不正です。置換エラーは、次のエラーからも確認できます。
解決策も非常に簡単で、/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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: CentOS 7 で rpm パッケージを使用して MySQL 5.7.18 をインストールする
>>: フックを使用して React コンポーネントを書くときに注意すべき 5 つの点
これは主に CSS スタイルのコントロールと META タグです。コードをコピーコードは次のとおりで...
Yum (フルネームは Yellow dog Updater, Modified) は、Fedora...
目次序文レンダリングsetTable コンポーネント使用結論序文フォームを使用して PC 側のプロジ...
目次序文1. ssコマンド2. Zabbix監視マシンの全体的なソケットステータス2.1. スクリプ...
1. 水平中央公開コード: html: <div class="parent&quo...
目次序文問題: 大きなファイルのコピーNodeJS のストリームとバッファバッファストリーム解決策 ...
<input> はユーザー情報を収集するために使用され、終了ステートメントはありません。...
HTML フォーム タグのチュートリアル。このセクションでは、主に Web ページで INPUT タ...
MySQL 5.7.8 では json フィールドが導入されました。このタイプのフィールドは使用頻度...
物件の詳細な説明transition 属性の目的は、一部の CSS プロパティ (背景など) をスム...
以下のように表示されます。主に認証コマンドを実行します: 2つの方法1. 任意のホストがユーザー b...
1. jsonオブジェクトをjson文字列に変換し、文字列が「{}」であるかどうかを判断します。 v...
問題を見つける最近MySQLをMySQL 5.7にアップグレードした後、次のようなクエリでグループ化...
このチュートリアルでは CentOS 7 64 ビットを使用します。各仮想マシンに 2GB のメモリ...
この記事では、カルーセルチャートの小さなケースを実装するためのJSの具体的なコードを参考までに共有し...