負荷分散の基礎知識とnginxを使用した負荷分散の簡単な例

負荷分散の基礎知識とnginxを使用した負荷分散の簡単な例

Nginx は、一般的に 7 層の負荷分散に使用できます。この記事では、負荷分散に関する基本的な知識と、負荷分散に nginx を使用する簡単な例を紹介します。

レイヤー 4 負荷分散とレイヤー 7 負荷分散

7 層負荷分散や 4 層負荷分散についてよく話されますが、これは実際には ISO OSI ネットワーク モデルの層の名前によって決まります。nginx は http プロトコルを使用してアプリケーション層で負荷分散操作を実行するため、7 層負荷分散と呼ばれます。 TCP 層での LVS などの負荷分散操作は、4 層負荷分散と呼ばれます。一般的に言えば、負荷分散には次のカテゴリがあります。

共通ソフトウェアサポート

一般的な負荷分散アルゴリズム

一般的な負荷分散アルゴリズムには次のようなものがあります。

負荷分散のデモ例: 通常のポーリング

次に、nginx を使用して通常のポーリングを実行する方法を示します。

準備

2 つのサービスがそれぞれポート 7001/7002 で起動され、異なる情報が表示されます。デモンストレーションの便宜上、tornado を使用してミラーが作成されます。Docker コンテナの起動時に異なるパラメータが渡され、サービスの違いが表示されます。

[root@kong ~]# docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "ユーザーサービス1: 7001"
ddba0abd24524d270a782c3fab907f6a35c0ce514eec3159357bded09022ee57
[root@kong ~]# docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "ユーザーサービス1: 7002"
95デッド795e19f675891bfcd44e5ea622c95615a95655d1fd346351eca707951
[root@kong ~]# 
[root@kong ~]# curl http://192.168.163.117:7001
こんにちは、サービス:ユーザーサービス1:7001
[root@kong ~]# 
[root@kong ~]# curl http://192.168.163.117:7002
こんにちは、サービス:ユーザーサービス1:7002
[root@kong ~]#

nginxを起動する

[root@kong ~]# docker run -p 9080:80 --name nginx-lb -d nginx 
9d53c7e9a45ef93e7848eb3f4e51c2652a49681e83bda6337c89a3cf2f379c74
[root@kong ~]# docker ps |grep nginx-lb
9d53c7e9a45e nginx "nginx -g 'daemon ..." 11 秒前 10 秒前に起動 0.0.0.0:9080->80/tcp nginx-lb
[root@kong ~]#

nginx コードスニペット

次のnginxコードスニペットを準備し、nginxの/etc/nginx/conf.d/default.confに追加します。

http {
アップストリーム nginx_lb {
  サーバー 192.168.163.117:7001;
  サーバー 192.168.163.117:7002;
}
サーバー{
  聞く 80;
  サーバー名 www.liumiao.cn 192.168.163.117;
  位置 / {
    proxy_pass http://nginx_lb;
  }
}

default.conf を変更する方法

これは、コンテナに vim をインストールし、ローカルで変更してから docker cp 経由で渡すか、sed で直接変更することで実現できます。コンテナにvimをインストールする場合は、次の方法を使用します

[root@kong ~]# docker exec -it nginx-lb sh
# apt-getアップデート
...省略 #apt-get install vim
...省略

修正前

# cat デフォルト.conf
サーバー{
  聞く 80;
  server_name ローカルホスト;
  #文字セット koi8-r;
  #access_log /var/log/nginx/host.access.log メイン;
  位置 / {
    ルート /usr/share/nginx/html;
    インデックス index.html index.htm;
  }
  #エラーページ 404 /404.html;
  # サーバーのエラーページを静的ページ /50x.html にリダイレクトします
  #
  エラーページ 500 502 503 504 /50x.html;
  場所 = /50x.html {
    ルート /usr/share/nginx/html;
  }
  # PHP スクリプトを 127.0.0.1:80 で listen している Apache にプロキシします
  #
  #場所 ~ \.php$ {
  # プロキシパス http://127.0.0.1;
  #}
  # PHP スクリプトを 127.0.0.1:9000 で待機している FastCGI サーバーに渡します
  #
  #場所 ~ \.php$ {
  #ルートhtml;
  #fastcgi_pass 127.0.0.1:9000;
  # fastcgi_index インデックス.php;
  # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  #fastcgi_params を含めます。
  #}
  # Apacheのドキュメントルートが.htaccessファイルへのアクセスを拒否する
  # nginxのものと一致します
  #
  #場所 ~ /\.ht {
  # すべて拒否;
  #}
}
#

# cat デフォルト.conf
アップストリーム nginx_lb {
  サーバー 192.168.163.117:7001;
  サーバー 192.168.163.117:7002;
}
サーバー{
  聞く 80;
  サーバー名 www.liumiao.cn 192.168.163.117;
  #文字セット koi8-r;
  #access_log /var/log/nginx/host.access.log メイン;
  位置 / {
    nginx を /usr/share/html にコピーします。
    #インデックス index.html index.htm;
    proxy_pass http://nginx_lb;
  }
  #エラーページ 404 /404.html;
  # サーバーのエラーページを静的ページ /50x.html にリダイレクトします
  #
  エラーページ 500 502 503 504 /50x.html;
  場所 = /50x.html {
    ルート /usr/share/nginx/html;
  }
  # PHP スクリプトを 127.0.0.1:80 で listen している Apache にプロキシします
  #
  #場所 ~ \.php$ {
  # プロキシパス http://127.0.0.1;
  #}
  # PHP スクリプトを 127.0.0.1:9000 で待機している FastCGI サーバーに渡します
  #
  #場所 ~ \.php$ {
  #ルートhtml;
  #fastcgi_pass 127.0.0.1:9000;
  # fastcgi_index インデックス.php;
  # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  #fastcgi_params を含めます。
  #}
  # Apacheのドキュメントルートが.htaccessファイルへのアクセスを拒否する
  # nginxのものと一致します
  #
  #場所 ~ /\.ht {
  # すべて拒否;
  #}
}
#

nginxコンテナを再起動します

[root@kong ~]# docker nginx-lbを再起動します
nginx-lb
[root@kong ~]#

結果を確認する

ポーリングが順番に実行されていることがはっきりとわかります。

[root@kong ~]# curl http://localhost:9080
こんにちは、サービス:ユーザーサービス1:7001
[root@kong ~]# curl http://localhost:9080
こんにちは、サービス:ユーザーサービス1:7002
[root@kong ~]# curl http://localhost:9080
こんにちは、サービス:ユーザーサービス1:7001
[root@kong ~]# curl http://localhost:9080
こんにちは、サービス:ユーザーサービス1:7002
[root@kong ~]#

負荷分散デモの例: 加重ラウンドロビン

これを基に、加重ポーリングでは重みを追加するだけで済みます。

default.conf を変更する

default.confを次のように変更します

# cp default.conf default.conf.org
# vi デフォルト.conf
# diff default.conf default.conf.org
2,3c2,3
< サーバー 192.168.163.117:7001 重み = 100;
< サーバー 192.168.163.117:7002 重み = 200;
---
> サーバー 192.168.163.117:7001;
> サーバー 192.168.163.117:7002;
#

nginxコンテナを再起動します

[root@kong ~]# docker nginx-lbを再起動します
nginx-lb
[root@kong ~]#

結果を確認する

投票結果は 1/3 と 2/3 の割合に従って行われていることがわかります。

[root@kong ~]# curl http://localhost:9080
こんにちは、サービス:ユーザーサービス1:7001
[root@kong ~]# curl http://localhost:9080
こんにちは、サービス:ユーザーサービス1:7002
[root@kong ~]# curl http://localhost:9080
こんにちは、サービス:ユーザーサービス1:7002
[root@kong ~]#

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • nginx ロードバランシングを介して https にリダイレクトする方法
  • Nginx 7層リバースプロキシと負荷分散についての簡単な説明
  • Nginx サーバーの負荷分散戦略の詳細説明(6 種類)
  • Nginx の負荷分散の 4 つのモードの簡単な分析
  • Linux で nginx ロード バランシングを構築する方法
  • nginxは負荷分散と動的および静的分離を実現します
  • Nginx 負荷分散構成の簡単な構成方法
  • nginx ロードバランシングの 3 つのパラメータ設定
  • Nginx ロードバランシングの詳しい説明(アーキテクチャロード)
  • iis+nginx で負荷分散を実現するための詳細な手順

<<:  jsはCanvasを使用して複数の画像を1つの実装コードにマージします

>>:  権限の問題によりMySQLの設定ファイルmy.cnfを起動できない問題の解決方法

推薦する

CSS3のbox-shadowプロパティの使い方の詳細な例

CSS には多くの属性があります。特に複数の値を設定する必要がある属性は、長期間使用しないと忘れられ...

CentOS8.0ネットワーク設定の実装

1. CentOS 7 と CentOS 8 のネットワーク構成の違い: VMware Workst...

MySQLデータベースの基礎知識と操作のまとめ

この記事では、例を使用して、MySQL データベースの基本的な知識と操作について説明します。ご参考ま...

データベースの冗長フィールドを合理的に使用する方法

privot は、多対多の関係の中間テーブルです。 PT5 フレームワークは自動的に privot ...

Nginx リバース プロキシを使用してクロスドメイン問題を解決する方法の詳細な説明

質問前回のクロスドメイン リソース共有に関する記事では、ドメイン間で Cookie を送信する場合、...

MySQL Truncate の使用方法の詳細な説明

目次MySQL 切り捨ての使用1. 構文を切り捨てる2. Truncateの使用上の注意3. TRU...

ウェブページ上でデスクトップ exe プログラムを呼び出す簡単な方法

この記事では主に、Web ページ上でデスクトップ exe プログラムを呼び出す方法を紹介します。 W...

nginx がドメイン名アクセス用に設定されている場合にドメイン名の後に 2 つのスラッシュ // が表示される問題の解決方法

最近、個人のウェブサイトを書き直しました。Alibaba Cloudで新しいサーバーを購入しました。...

パズル効果を実現するネイティブ js

この記事では、パズル効果を実現するためのネイティブjsの具体的なコードを参考までに共有します。具体的...

MySQL における int の最大値の詳細な説明

導入2日前に見た問題について詳細に書きます。バイトコンピューターがバイナリに基づいていることは誰もが...

JSはjQueryのappend関数を実装します

目次コードを見せてください効果をテストする効果追伸別のアプローチコードを見せてください HTMLEl...

WeChatアプレット開発によりホームページポップアップボックスアクティビティガイダンス機能が実現

目次1. 需要2. データベース設計3.Javaバックグラウンド構成の実装4. WeChatアプレッ...

ネイティブ JavaScript メッセージボード

この記事では、参考までにメッセージボードを実装するためのJavaScriptの具体的なコードを紹介し...

アップロード画像コントロールを実現するネイティブ js

この記事の例では、アップロード画像コントロールを実装するためのjsの具体的なコードを参考までに共有し...

nginx 503 サービスが一時的に利用できない問題を解決する方法

最近、ウェブサイトを更新すると、503 Service Temporarily Unavailabl...