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)

推薦する

Q&A: XML と HTML の違い

Q: xml と html の違いがわかりません。違いは何ですか? A: XMLと HTML の違い...

MySQL の列から行への変換と年月グループ化の例

以下のように表示されます。 SELECT count(DISTINCT(a.rect_id)) zc...

シーケンス関数を実装する MySQL コード

MySQLはシーケンス関数を実装する1. シーケンスレコードテーブルを作成する テーブル `sys_...

MySqlサブクエリINの実装と最適化

目次IN が遅いのはなぜですか? INとEXISTSのどちらが速いでしょうか?効率を向上させるにはど...

Linux環境でのDockerインストールチュートリアル

1. 設置環境Dockerは次のCentOSバージョンをサポートしていますCentOS 6.5 (6...

フィールドの文字セットの違いによる MySQL のインデックス失敗の解決策

インデックスとは何ですか?なぜインデックスを作成するのですか?インデックスは、列に特定の値を持つ行を...

異なる列を持つテーブルのクエリ結果のSQLマージ操作

2 つの異なるテーブルをクエリするには、結果をマージする必要があります。たとえば、table1 の列...

25 個の CSS フレームワーク、ツール、ソフトウェア、テンプレートを共有

スプライトカウダウンロード CSS リントダウンロード プレフィックスダウンロード 1140px C...

MySQLのストレージエンジンの詳細な説明

MySQL ストレージ エンジンの概要ストレージ エンジンとは何ですか? MySQL のデータは、さ...

高性能ウェブサイトの最適化ガイド

パフォーマンスの黄金律:エンドユーザーの応答時間のわずか 10% ~ 20% が HTML ドキュメ...

eject を使用せずに create-react-app の設定を変更する方法

1. イジェクトが推奨されないのはなぜですか? 1. eject を実行した後、どのような変化があり...

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

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

SpringBoot プロジェクトの Docker クイック デプロイメントの紹介

1. Dockerをインストールするまず Linux 環境を開き、次のコマンドを入力してインストール...

IE環境では、divの高さはフォントの高さよりも大きくなければならないと規定されています。

コードをコピーコードは次のとおりです。 <div class="content&qu...

Windows 10 64 ビット版に MySQL 5.6.35 をインストールするためのグラフィック チュートリアル

1. MySQL Community Server 5.6.35をダウンロードするダウンロードアドレ...