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)

推薦する

MySql Group Byは複数のフィールドのグループ化を実装します

日常の開発タスクでは、データ テーブル内のグループ化フィールドに基づいて統計データを取得するために、...

ウェブサイトのアクセス速度を向上させるための徹底的な最適化に関するヒント

ウェブサイトのアクセス速度を向上させるための徹底的な最適化に関するヒント。ウェブサイトのアクセス速度...

MySQL 5.7 のキーワードと予約語の詳細な説明

序文MySQL と Oracle のキーワードはまったく同じではありません。Oracle データベー...

webpack と rollup を使用してコンポーネント ライブラリをパッケージ化する方法

序文以前、ローディングスタイルのコンポーネントを作成しました。コードの再利用性を実現するために、この...

Vue の新しいパートナー TypeScript クイックスタート実践記録

目次1. 公式の足場を使って構築する2. プロジェクトディレクトリ分析3. TypeScript の...

デザイン理論:計画、リソース、コミュニケーションの問題について

<br />多くの中小企業ではこの問題は発生しません。中小企業はデザイナーをサポートし、...

opensslを使用して無料の証明書を生成する方法

1: openssl とは何ですか? その機能は何ですか?適用シナリオは何ですか? Baidu 百科...

全画面ページのスクロール効果を実現するJavaScript

JavaScript DOM を読み終えた後、解釈型 JavaScript スクリプト言語に対する...

Ubuntu 18.04 サーバーのパスワードを忘れたり改ざんされた場合にパスワードをリセットする方法

最近、サーバー上のアカウントが2つハッキングされ、パスワードが改ざんされました。幸い、まだ使えるアカ...

異なるデータベースで DROP TABLE を書く方法

異なるデータベースで DROP TABLE を書く方法1.MySQL 存在する場合はテーブルを削除 ...

MySQL SQL ステートメントが遅い場合の一般的な原因と解決策

1. インデックス不足または無効なインデックスによるクエリの遅延数千万件のデータを含むテーブルで、イ...

CSSでフォントアイコンを使用する方法をお教えします

まず、フォントアイコンとは何でしょうか?表面的にはアイコンですが、実際はテキストです。テキストの設定...

MySQLはテーブルデータを復元するためにfrmファイルとibdファイルを使用します

目次frm ファイルと ibd ファイルの紹介frm ファイル回復テーブル構造ibd ファイル回復テ...

SSMは、mysqlデータベースアカウントのパスワード暗号文ログイン機能を実装します。

導入当社は、情報セキュリティと機密アプリケーションに関わるいくつかのプロジェクトの研究開発に従事して...

JS 手ぶれ補正機能の実装と使用シナリオ

目次1. 手ぶれ補正機能とは何ですか? 1. なぜ手ぶれ補正機能が必要なのでしょうか? 2. 手ぶれ...