Nginx リバース プロキシと負荷分散の実践

Nginx リバース プロキシと負荷分散の実践

リバースプロキシ

リバースプロキシとは、プロキシサーバーを介してユーザーのアクセス要求を受信し、ユーザーに代わって内部サーバーへの要求を再開し、最終的に内部サーバーの応答情報をユーザーに返すことを指します。このように、プロキシ サーバーは外部からはサーバーのように見え、内部サーバーにアクセスするクライアントは実際の Web サイト アクセス ユーザーの代わりにプロキシ サーバーを使用します。

リバースプロキシを使用する理由

  • インターネットからのすべてのリクエストは最初にプロキシ サーバーを通過する必要があるため、Web サイトのセキュリティを保護できます。
  • 静的リソースをキャッシュすることで Web リクエストを高速化します。
  • 負荷分散の実装

リバースプロキシの例

環境説明

2 つのサーバー AB があるとします。サーバー A は Web リソースを提供し、イントラネットからのみアクセスできます。サーバー B には 2 つのネットワーク カードがあり、1 つはサーバー A と同じイントラネット内にあり、もう 1 つは外部ネットワーク内にあります。この時点では、ユーザー C がサーバー A に直接アクセスすることはできません。このとき、ユーザー C のリクエストはサーバー B を介してアクセスできます。

ホスト名ネットワークカードIP例示する
モリ-04 ens33 192.168.30.6イントラネット IP、プロキシ サーバー
モリ-04 ens37 192.168.93.129外部IP、プロキシサーバー
モリ-05 ens33 192.168.30.7イントラネットサーバー

  • 両方のマシンにnginxをインストールする
  • moli-05サーバアクセスはWordPressブログ、ドメイン名blog.syushin.orgです
  • 仮想マシンの実験環境では、すべてのファイアウォールがオフになっています。

仮想ホストの設定

moli-04 マシン上の仮想ホスト構成ファイルを編集します。内容は次のとおりです。

[root@moli-04 extra]$ cat blog.syushin.org.conf 
サーバ{
 聞く 80;
 サーバー名 blog.syushin.org;
 
 位置 / {
  プロキシパス http://192.168.30.7;
  proxy_set_header ホスト $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 } 
}

ホストファイルを変更する

Windowsのhostsファイルを変更し、設定を追加する

192.168.93.129 ブログ

ブラウザテスト

アクセスアドレスは192.168.93.129で、インターフェースにマシン05のページが表示され、設定は成功しています。

負荷分散

負荷分散機能

  • ユーザーアクセスリクエストのスケジュールと管理
  • ユーザーアクセス要求のプレッシャーを共有する

負荷分散クラスターが実行中の場合、通常、1 つ以上のフロントエンド ロード バランサーを介して、クライアント アクセス要求がバックエンド サーバーのグループに送信されます。

Nginx 負荷分散

厳密に言えば、Nginx は Nginx Proxy のリバースプロキシとしてのみ使用されますが、このリバースプロキシ機能の効果は負荷分散マシンの効果であるため、nginx ロードバランシングは特殊なリバースプロキシです。

Nginx 負荷分散を実装するための主なコンポーネントは次のとおりです。

Nginx モジュール例示する
ngx_http_proxy_モジュールプロキシモジュール。サーバーノードまたは上流サーバープールにリクエストを送信するために使用されます。
ngx_http_upstream_モジュール負荷分散モジュールは、ウェブサイトの負荷分散機能とノードのヘルスチェックを実現できます。

アップストリームモジュールの紹介

ngx_http_upstream_module モジュールでサポートされているプロキシ方式には proxy_pass、fastcgi_pass などがあり、主に proxy_pass が使用されます。

アップストリーム モジュールを使用すると、nginx は 1 つ以上のノード サーバー グループを定義できます。これを使用すると、Web サイト リクエストは proxy_pass プロキシを介して定義された対応するノード グループに送信されます。

例: ノード サーバー プールの作成

アップストリームブログ
 サーバー 192.168.30.5:80 重み=5;
 サーバー 192.168.30.6:81 重み=10;
 サーバー 192.168.30.7:82 重み=15;
}

upstream : ノード サーバー グループを作成するためのキーワード (必須)。
blog : ノード サーバー グループの名前。必須で、カスタマイズできます。
server : キーワード、その後に IP またはドメイン名、または IP:ポートが続きます。ポートが指定されていない場合、デフォルト値は 80 です。
weight : 重み。値が大きいほど、割り当てられるリクエストが多くなります。デフォルトは1です

重みに加えて、ノード サーバーのステータス値を次のように設定することもできます。
max_fails : 許容されるリクエスト失敗のデフォルトの数は 1 です。最大数を超えると、proxy_next_upstream モジュールで定義されたエラーが返されます。
fail_timeout : max_fails 回の失敗後の一時停止時間。
down : 現在のノードサーバーが負荷に参加していないことを示し、マシンが利用できないことを示します。iP_hashと一緒に使用できます。
backup : バックアップ以外のマシンがすべてダウンしているかビジー状態の場合は、バックアップ マシンを要求します。したがって、このマシンは最も軽い圧力がかかります。

ドメイン名をアップストリームで使用する

アップストリームブログ2{
 サーバー www.syushin.com weight=5;
 サーバー blog.syushin.org がダウンしました。
 サーバー blog.syushin.cc のバックアップ;
}

スケジューリングアルゴリズム

rr ポーリング (デフォルトのスケジューリング アルゴリズム、静的スケジューリング アルゴリズム)

クライアント要求の順序に従って、クライアント要求を異なるバックエンド ノード サーバーに 1 つずつ分散します。

wrr (重み付けラウンドロビン、静的スケジューリング アルゴリズム)

重みは rr ポーリングに基づいて追加されます。このアルゴリズムを使用する場合、重みはユーザー アクセスに比例します。重みの値が大きいほど、転送されるリクエストが多くなります。
たとえば、リクエストが 30 件あり、サーバー A (10.0.0.1) とサーバー B (10.0.0.2) が 2 つある場合、A で 10 件のリクエストを処理し、B で 20 件のリクエストを処理するには、次のように定義します。

上流プール{
 サーバー 10.0.0.1 重み=1;
 サーバー 10.0.0.2 重み=2;
}

ip_hash (静的スケジューリングアルゴリズム)

各リクエストは、クライアント IP のハッシュ結果に従って割り当てられます。新しいリクエストが到着すると、クライアント IP は最初にハッシュ アルゴリズムによって値にハッシュされます。後続のクライアント リクエストでは、クライアント IP のハッシュ値が同じである限り、同じサーバーに割り当てられます。

アップストリームブログプール{
 ip_ハッシュ;
 サーバー 192.168.30.5:80;
 サーバー 192.168.30.6:8090;
}

注意: ip_hash を使用する場合、重みとバックアップは許可されません。

least_connアルゴリズム

least_conn アルゴリズムは、バックエンド サーバーへの接続数に基づいて分散を決定し、接続数が最も少ないサーバーに、より多くのリクエストが割り当てられます。

上記に挙げた(一般的に使用される)スケジューリング アルゴリズムの他にも、ここでは 1 つ 1 つ挙げていない多くのアルゴリズムがあります。

http_proxy_module モジュール

http_proxy_module はリクエストを別のサーバーに転送できます。リバース プロキシでは、指定された URI が location 関数を通じて照合され、一致する URI に一致するリクエストが proxy_pass を通じて定義された上流ノード プールにスローされます。

http_proxy モジュールのパラメータ

パラメータ例示する
プロキシセットヘッダーHTTPリクエストヘッダー項目をバックエンドサーバーノードに設定します。たとえば、プロキシバックエンドサーバーノードがアクセスクライアントユーザーの実際のIPアドレスを取得できるようにするには、次のようにします。
クライアント本体バッファサイズクライアントのリクエストボディバッファサイズを指定するために使用します
プロキシ接続タイムアウトリバースプロキシバックエンドノードサーバ接続のタイムアウト期間、つまりハンドシェイクを開始して応答を待つタイムアウト期間を示します。
プロキシ送信タイムアウトプロキシバックエンドサーバーのデータ転送時間を示します。つまり、バックエンドサーバーは指定された時間内にすべてのデータを転送する必要があります。そうでない場合、nginxは接続を切断します。
プロキシ読み取りタイムアウトnginx がプロキシのバックエンド サーバーから情報を取得する時間を設定します。これは、接続が正常に確立された後、nginx がバックエンド サーバーの応答を待機することを意味します。実際には、nginx がバックエンド キューに入り、処理を待機している時間です。
プロキシバッファサイズバッファ サイズを設定します。デフォルトでは、バッファ サイズは proxy_buffers ディレクティブで設定されたサイズと同じです。
プロキシバッファバッファの数とサイズを設定します。nginxがプロキシバックエンドサーバーから取得した応答情報はバッファに設定されます。
プロキシビジーバッファサイズサーバーがビジー状態のときに使用できる proxy_buffers のサイズを設定するために使用されます。公式に推奨されるサイズは proxy_buffers * 2 です。
proxy_trmp_file_write_size一時プロキシキャッシュファイルのサイズを指定する

Proxy_pass の使用法

形式: proxy_pass URL;

次に例を示します。

proxy_pass http://blog.syushin.com/;
プロキシパス http://192.168.30.7:8080/uri;
proxy_pass http://tmp/www.sock;

URL はドメイン名、IP アドレス、またはソケット ファイルになります。

proxy_pass 設定に関して注意すべき点がいくつかあります。
例1

場所 /アップロード/ {
プロキシパス http://192.168.30.7;
}

例2

場所 /アップロード/ {
proxy_pass http://192.168.30.7/; # 余分なスラッシュに注意してください
}

例3

場所 /アップロード/ {
proxy_pass http://192.168.30.7/blog/;
}

例4

場所 /アップロード/ {
proxy_pass http://192.168.30.7/blog;
}

server_name が blog.syushin.com の場合、http://blog.syushin.com/uploa... をリクエストすると、上記の例 1-4 のリクエスト結果は次のようになります。

例1: http://192.168.30.7/upload/index.html
例2: http://192.168.30.7/index.html
例3: http://192.168.30.7/blog/index.html
例4: http://192.168.30.7/blogindex.html

さて、今回の記事は以上です。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nginx 7層リバースプロキシと負荷分散についての簡単な説明
  • Nginx のロードバランシングとリバースプロキシの設定と最適化の詳細な説明
  • nginx のロードバランシングとリバースプロキシの説明
  • 負荷分散を実現するために nginx をリバースプロキシとして使用する例
  • Nginx リバース プロキシと負荷分散の概念の理解とモジュールの使用

<<:  MySQL の binlog_format モードと設定の詳細な分析

>>:  Amap を使用した React 実装例 (react-amap)

推薦する

Vueはechartsを使用して組織図を描画します

昨日、円形のプログレスバー (Vue 円形プログレスバーを参照してください) についてブログを書きま...

Promise カプセル化 wx.request メソッド

前回の記事では、Promise を使用して小さなプログラム wx.request をカプセル化する実...

HTML で自動ページジャンプを実現する 5 つの方法

前回の記事では、HTML ページが 3 秒後に自動的にジャンプする一般的な 3 つの方法を紹介しまし...

MySQL カーソル関数と使用法

目次意味カーソルの役割カーソルの使用カーソルの宣言カーソルを開くカーソルデータのトラバースカーソルを...

JavaScript演算子の使用に関するヒントをいくつか共有します

目次1. オプションの連鎖演算子 [? .】 2. 論理的な空の代入 (?? =) 3. 論理和代入...

ウェブデザイン必携ハンドブック 216 ウェブセーフカラー

Web ページ上の色の表現は、さまざまな要因によって影響を受けます。Web ページで非常に美しい配色...

iframeフレームはIEブラウザで白い背景を透明に設定します

最近、プロジェクトを進める過程で、ページの階層構造を描画するために iframe を頻繁に使用する必...

HTML ページ適応幅テーブル

WEB アプリケーションのページでは、テーブルがよく使用されます。列の数が限られているため、各列のコ...

HTML テーブル マークアップ チュートリアル (43): テーブル ヘッダーの VALIGN 属性

垂直方向では、ヘッダーの配置を上、中央、下に設定できます。基本的な構文構文Top は上、Middle...

Mysql での結合操作

結合の種類1. 内部結合: 結合関係を持つ 2 つのテーブル内のフィールドは、結合関係を満たすレコー...

MySQL の重要なログファイルの包括的なインベントリ

目次導入ログ分類パラメータファイルエラーログファイル完全なログファイルスロークエリログバイナリログフ...

フォームの読み取り専用属性と無効な属性についての簡単な説明

フォーム内の読み取り専用および無効な属性1. 読み取り専用:サーバーは、ユーザーがデータを変更するこ...

HTMLページ埋め込み動画とJSコントロール切り替え動画例の詳しい説明

まず、ページにビデオを埋め込むための HTML コードは次のとおりです。コードをコピーコードは次のと...

React ページ ターナーの実装 (フロント エンドとバックエンドを含む)

目次フロントエンド上記のアイデアに従って、ページめくり機能を設計して記述します。バックエンド(Jav...

Linuxターミナルでの一般的なMySQL操作コマンドの詳細な説明

仕える: # chkconfig --list すべてのシステム サービスを一覧表示します # ch...