Nginx で何ができるかの包括的な分析

Nginx で何ができるかの包括的な分析

序文

この記事は、サードパーティのモジュールをロードせずにNginxで処理できることのみに焦点を当てています。サードパーティのモジュールが多すぎるため、すべてを紹介することは不可能です。もちろん、この記事自体が完全ではない可能性があります。結局のところ、個人的に使用して理解したことだけです。どうぞお許しください。メッセージを残してくださると嬉しいです

Nginxでできること

1. リバースプロキシ
2. 負荷分散
3. HTTPサーバー(動的および静的分離を含む)
4. フォワードプロキシ

上記は、サードパーティのモジュールに頼らずにNginxで何ができるかについて私が知っていることです。以下は、各機能を実行する方法の詳細な説明です。

リバースプロキシ

リバース プロキシは、おそらく Nginx が行う最も一般的なことです。リバース プロキシとは何でしょうか? Baidu 百科事典には次のように書かれています。リバース プロキシとは、プロキシ サーバーを使用してインターネット上の接続要求を受け付け、その要求を内部ネットワーク上のサーバーに転送し、サーバーから取得した結果をインターネット上の接続を要求しているクライアントに返すことを指します。このとき、プロキシ サーバーは外部からはリバース プロキシ サーバーのように見えます。簡単に言うと、実サーバーは外部ネットワークから直接アクセスできないため、プロキシサーバーが必要になります。プロキシサーバーは外部ネットワークからアクセスでき、実サーバーと同じネットワーク環境にあります。もちろん、ポートが異なる同じサーバーでもかまいません。

リバースプロキシを実装するための簡単なコードは次のとおりです。

サーバー{
    聞く 80;                             
    server_name ローカルホスト;                        
    クライアントの最大ボディサイズ 1024M;

    位置 / {
      proxy_pass http://localhost:8080;
      proxy_set_header ホスト $host:$server_port;
    }
  }

設定ファイルを保存したら、Nginx を起動します。localhost にアクセスすると、localhost:8080 にアクセスするのと同じになります。

負荷分散

負荷分散も Nginx でよく使用される機能です。負荷分散とは、Web サーバー、FTP サーバー、企業の主要なアプリケーション サーバー、その他のミッション クリティカルなサーバーなど、複数の操作ユニットに実行を分散して、作業タスクをまとめて完了することを意味します。簡単に言うと、サーバーが 2 台以上ある場合、リクエストは指定されたサーバーにランダムに分散され、ルールに従って処理されます。負荷分散構成では、通常、リバース プロキシの構成も同時に必要であり、リバース プロキシを介して負荷分散にジャンプします。 Nginx は現在、3 つの組み込み負荷分散戦略と 2 つの一般的に使用されるサードパーティ戦略をサポートしています。

1. RR(デフォルト)

各リクエストは時系列順に 1 つずつ異なるバックエンド サーバーに割り当てられます。バックエンド サーバーがダウンしている場合は、自動的に削除されます。

シンプルな構成

 上流テスト{
    サーバー localhost:8080;
    サーバー localhost:8081;
  }
  サーバー{
    聞く 81;                             
    server_name ローカルホスト;                        
    クライアントの最大ボディサイズ 1024M;

    位置 / {
      proxy_pass http://test;
      proxy_set_header ホスト $host:$server_port;
    }
  }

負荷分散のコアコードは

  上流テスト{
    サーバー localhost:8080;
    サーバー localhost:8081;
  }

ここでは 2 つのサーバーを設定しましたが、もちろん実際には 1 つですが、ポートが異なり、サーバー 8081 は存在しないため、アクセスできません。ただし、http://localhost にアクセスすると、問題なく、デフォルトで http://localhost:8080 にジャンプします。これは、Nginx がサーバーの状態を自動的に判断するためです。サーバーにアクセスできない場合 (サーバーがダウンしている場合)、このサーバーにジャンプしないため、サーバーがダウンして使用に影響する状況も回避できます。Nginx はデフォルトで RR ポリシーになっているため、他の設定は必要ありません。

2. 重量

ポーリング確率を指定します。重みはアクセス率に比例し、バックエンド サーバーのパフォーマンスが不均一な場合に使用されます。

例えば

  上流テスト{
    サーバー localhost:8080 weight=9;
    サーバー localhost:8081 weight=1;
  }

すると、一般的に 10 人中 1 人だけが 8081 にアクセスし、10 人中 9 人が 8080 にアクセスします。

3. ip_ハッシュ

上記の 2 つの方法には問題があります。つまり、次のリクエストが来たときに、リクエストが別のサーバーに分散される可能性があります。プログラムがステートレスではない場合 (セッションを使用してデータを保存する場合)、この時点で大きな問題が発生します。たとえば、ログイン情報がセッションに保存されている場合、別のサーバーにジャンプするときに再度ログインする必要があります。そのため、多くの場合、顧客が 1 つのサーバーにのみアクセスする必要がある場合は、ip_hash を使用する必要があります。ip_hash の各リクエストは、アクセス IP のハッシュ結果に従って割り当てられるため、各訪問者は固定のバックエンド サーバーにアクセスし、セッションの問題を解決できます。

  上流テスト{
    ip_ハッシュ;
    サーバー localhost:8080;
    サーバー localhost:8081;
  }

4. 公正(第三者)

リクエストはバックエンド サーバーの応答時間に基づいて分散され、応答時間が短いリクエストが優先されます。

  アップストリームバックエンド{ 
    公平; 
    サーバー localhost:8080;
    サーバー localhost:8081;
  }

5. url_hash(サードパーティ)

アクセスされた URL のハッシュ結果に応じてリクエストが分散され、各 URL が同じバックエンド サーバーに送られます。これは、バックエンド サーバーがキャッシュされている場合に、より効果的です。 アップストリームにハッシュ ステートメントを追加します。重みなどの他のパラメータは、サーバー ステートメントに書き込むことはできません。hash_method は、使用されるハッシュ アルゴリズムです。

  アップストリームバックエンド{ 
    $request_uri をハッシュします。 
    ハッシュメソッドCRC32; 
    サーバー localhost:8080;
    サーバー localhost:8081;
  }

上記の 5 種類の負荷分散はそれぞれ異なる状況に適しているため、実際の状況に応じてどの戦略モードを使用するかを選択できます。ただし、fair と url_hash を使用するには、サードパーティのモジュールをインストールする必要があります。この記事では主に Nginx で何ができるかを紹介するため、Nginx 用のサードパーティ モジュールのインストールについてはこの記事では紹介しません。

HTTP サーバー

Nginx 自体も静的リソース サーバーです。静的リソースしかない場合は、Nginx をサーバーとして使用できます。同時に、静的リソースと動的リソースを分離することも非常に人気があり、これは Nginx を通じて実現できます。まず、静的リソース サーバーとしての Nginx を見てみましょう。

  サーバー{
    聞く 80;                             
    server_name ローカルホスト;                        
    クライアントの最大ボディサイズ 1024M;
    位置 / {
        ルート e:wwwroot;
        インデックス index.html;
      }
  }

このように、http://localhost にアクセスすると、デフォルトではドライブ E の wwwroot ディレクトリにある index.html にアクセスすることになります。Web サイトが単なる静的ページである場合は、この方法で展開できます。

静的と動的の分離

動的と静的の分離とは、動的ウェブサイト内の動的ウェブページが、一定のルールに従って、頻繁に変更されるリソースから不変のリソースを区別できるようにすることです。動的リソースと静的リソースを分離した後、静的リソースの特性に応じてキャッシュすることができます。これがウェブサイトの静的処理の核心的な考え方です。

上流テスト{ 
    サーバー localhost:8080; 
    サーバー localhost:8081; 
  }  

  サーバー{ 
    聞く 80; 
    server_name ローカルホスト; 

    位置 / { 
      ルート e:wwwroot; 
      インデックス index.html; 
    } 

    # すべての静的リクエストはnginxによって処理され、htmlディレクトリに保存されます 
    場所 ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ { 
      ルート e:wwwroot; 
    } 

    # すべての動的リクエストは処理場所として Tomcat に転送されます ~ .(jsp|do)$ { 
      proxy_pass http://test; 
    } 

    エラーページ 500 502 503 504 /50x.html; 
    場所 = /50x.html { 
      ルート e:wwwroot; 
    } 
  }

このように、HTML、画像、CSS、JSをwwwrootディレクトリに置くことができ、Tomcatはjspとリクエストの処理のみを担当します。たとえば、サフィックスがgifの場合、Nginxはデフォルトでwwwrootから現在のリクエストの動的な画像ファイルを取得して返します。もちろん、ここでの静的ファイルはNginxと同じサーバー上にあります。別のサーバーを使用して、リバースプロキシとロードバランシングを介して構成することもできます。最も基本的なプロセスを理解している限り、多くの構成は非常に簡単になります。さらに、localtionの後に実際には正規表現が続くため、非常に柔軟性があります。

フォワードプロキシ

フォワードプロキシは、クライアントとオリジンサーバーの間にあるサーバーです。クライアントは、オリジンサーバーからコンテンツを取得するために、プロキシにリクエストを送信し、ターゲット(オリジンサーバー)を指定します。プロキシは、リクエストをオリジンサーバーに転送し、取得したコンテンツをクライアントに返します。クライアントはフォワードプロキシを使用できます。サーバーをプロキシサーバーとして使用する必要がある場合は、Nginx を使用してフォワードプロキシを実装できます。ただし、現在、Nginx には問題があり、HTTPS をサポートしていません。Baidu で HTTPS フォワードプロキシを構成する方法を検索しましたが、プロキシとして使用できないことがわかりました。もちろん、私の構成が間違っている可能性もありますので、正しい方法を知っている同志がメッセージを残して説明してくれることを願っています。

リゾルバ 114.114.114.114 8.8.8.8;
  サーバー{

    リゾルバタイムアウト 5秒;

    聞く 81;

    アクセスログ e:wwwrootproxy.access.log;
    error_log e:wwwrootproxy.error.log;

    位置 / {
      proxy_pass http://$host$request_uri;
    }
  }

Resolver はフォワード プロキシを構成する DNS サーバーであり、listen はフォワード プロキシのポートです。構成が完了すると、IE や他のプロキシ プラグインでプロキシにサーバー IP + ポート番号を使用できるようになります。

最後に

Nginx はホット スタートをサポートしています。つまり、設定ファイルを変更した後、Nginx をシャットダウンせずに設定を有効にすることができます。もちろん、これを知っている人がどれだけいるかはわかりません。とにかく、最初は知らなかったので、Nginx スレッドを強制終了してから再起動することがよくありました。 。 。 Nginxが設定を再読み込みするためのコマンドは

nginx -s reload

Windowsでは

nginx.exe -s reload

要約する

以上が、Nginx で何ができるかについてご紹介しました。お役に立てれば幸いです。ご質問があれば、メッセージを残していただければ、すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • nginx httpsリバースプロキシtomcatを実装する2つの方法
  • nginx proxy_pass リバース プロキシ設定で URL の後に / を追加する場合と追加しない場合の違いの紹介
  • Nginx クラスタの負荷分散構成プロセスの分析
  • Linux での Nginx+Tomcat 負荷分散構成方法
  • 高性能ウェブ開発 nginx HTTP サーバー

<<:  Chrome Dev Tools を使用してページのパフォーマンスを分析する方法 (フロントエンドのパフォーマンス最適化)

>>:  MySQL パーティション関数の詳細な説明と例の分析

推薦する

Reactマウスの複数選択機能の設定方法

一般的に、リストには選択機能があり、単一選択、二重選択、複数選択が非常に一般的です。カスタム ループ...

GTK ツリービューの原理と使用法の分析

GtkTreeView コンポーネントは、美しい通常のリストやツリーのようなリストを作成できる高度な...

MySQL 5.7.17 winx64 のインストールと設定方法のグラフィックチュートリアル

Windows インストール mysql-5.7.17-winx64.zip メソッド レコード &...

ハイパーリンクアイコンの仕様: 記事の読みやすさを向上

1. ハイパーリンクアイコンの仕様とは?<br />ハイパーリンクアイコンの仕様は、「C...

HTTPプロトコルにおけるステータスコードの意味

暫定的な応答を示し、要求者に操作の続行を要求するステータス コード。コードの説明100 (続行) リ...

MySQL における INSERT INTO SET の利点

MySQL データベースにデータを挿入します。以前はよく使われていた INSERT INTO テーブ...

VMware Workstation 14 Pro に Win10 システムをインストールする

この記事では、VMware Workstation 14 Proにシステムをインストールする方法を紹...

テーブルセルの幅tdの設定は無効であり、内部コンテンツによって常に引き伸ばされます

テーブルページを作成するときに、td に設定された幅が無効になることがあります。td の幅は常に内部...

WeChatアプレットは記録機能を実装します

この記事では、WeChatアプレットのレコード機能を実装するための具体的なコードを参考までに紹介しま...

イメージを再構築せずにDockerにポートを動的に追加する方法

操作中に Docker コンテナの公開ポートを変更または追加する必要がある場合がありますが、実行中の...

MySQL countの詳細な説明と関数のサンプルコード

mysql countの詳細な説明count関数はテーブルや配列内のレコードを数えるために使われます...

MySQL 8.0 をインストールした後、初めてログインするときにパスワードを変更する問題を解決する

MySQL 8.0.16で初回ログイン時のパスワードを変更する方法を紹介します。 MySQLデータベ...

nginxで複数のサーバーを簡単に構成する方法

1: nginx のインストール方法については詳しく説明しません。Baidu で検索してください。 ...