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)

推薦する

CSS スタイルのリセットとクリア (異なるブラウザで同じ効果を表示するため)

異なるブラウザ間でページの表示を一致させるためには、フロントエンド開発において CSS スタイルのク...

js を使用して過去 1 週間、1 か月、3 か月の時間を取得する簡単な例

目次過去1週間の時間を取得する過去1か月の時間を取得する過去3か月分を取得新しい Date() と ...

njs モジュールを使用して nginx 構成に js スクリプトを導入する

目次序文1. NJSモジュールをインストールする方法1: NJSモジュールを動的にロードする方法2:...

Dockerでのpython3.8イメージのインストールについて

Docker Hub公式サイト1. Pythonミラーを検索するdocker 検索 python 2...

MySQLの共同クエリ最適化メカニズムの詳細な説明

目次MySQL フェデレーテッド クエリ実行戦略。実行計画フェデレーテッドクエリオプティマイザーMy...

Reactコンポーネントのライフサイクルの詳細な説明

目次1.ライフサイクルとは何か2. 読み込みプロセス1.コンストラクタ2. レンダリング3. コンポ...

Dockerコンテナデータボリュームの原理と使用法の分析

コンテナデータボリュームとはデータがコンテナ内にある場合、コンテナを削除するとデータは失われます。例...

スライド効果を実現するためのネイティブJavaScript

ページ、特にホームページを作成するときは、通常、Web サイト全体の他のメイン ページにリンクできる...

Vue マウスホイールスクロール切り替えルーティング効果を実装する方法

ルート ルーティング コンポーネント (アプリの下のルート ルーティング コンポーネント。子コンポー...

Ubuntu 18.04 向け VMware Tools のインストールと構成のチュートリアル

この記事では、Ubuntu 18.04でのVMware Toolsのインストールと設定について記録し...

MySQL Null は 5 つの問題を引き起こす可能性があります (すべて致命的)

目次1. カウントデータが失われる解決2. 明確なデータ損失3.データ損失を選択解決4. Nullポ...

SQL Server 2019 Always On クラスターの Docker デプロイメントの実装

目次Docker デプロイメント Always on クラスターDockerをインストールする建築関...

CSSは左固定と右適応のレイアウト方法を実現します

1. フローティングレイアウト1. 最初に固定幅の div をフロートさせます。ドキュメントフローか...

Dockerで最もよく使われるイメージコマンドとコンテナコマンドの詳細な説明

この記事では、Docker の使用で最もよく使用されるイメージ コマンドとコンテナ コマンドを一覧表...

Vue-routerルーティングの使い方

目次1. 説明2. インストール3. テスト1. 説明Vue Router は、Vue.js の公式...