この記事では、主に nginx のアプリケーションを紹介します。負荷分散に nginx を使用すると、特定の参考値が得られます。必要な友人は参考にしてください。nginx は一般的に 7 層の負荷分散に使用できます。この記事では、負荷分散の基礎知識と、負荷分散に nginx を使用する簡単な例を紹介します。
4 層負荷分散と 7 層負荷分散
実際には、7 層負荷分散か 4 層負荷分散かは、ISO OSI ネットワーク モデルの層の名前に基づいて決定されるとよく言われます。アプリケーション層で http プロトコルを使用し、負荷分散操作を実行するため、7 層負荷分散と呼ばれます。たとえば、TCP 層で負荷分散操作を実行する LVS は、層 4 負荷分散と呼ばれます。一般的に、負荷分散には次のような分類があります:
カテゴリ
OSIモデル層
説明 |
|
|
レイヤー2負荷分散
MAC層
MACアドレスに従って応答 | |
3層負荷分散 |
IP層
IPアドレスに応じて応答 |
|
4層負荷分散 |
TCP層
IPアドレスとポート番号の組み合わせに基づいて応答 |
|
7層負荷分散 |
HTTP層
4層をベースに、URL/ブラウザカテゴリなど7層の情報をもとにさらに応答し続けることが可能 |
|
| 共通ソフトウェアのサポート
ソフトウェア
4層負荷分散
7層負荷分散 |
|
|
nginx
軽量実装
httpとメールをサポート、パフォーマンスはhaproxy |
|
haproxy |
-
7層負荷分散をサポート | |
LVS |
- |
| F5 | ハードウェア実装と高コスト
- |
|
を実装する4層の負荷分散をサポートします |
-
バランスアルゴリズムには、以下:
負荷分散アルゴリズム | 負荷分散アルゴリズム(E) | nginxサポートの有無 | 手順 | 適用可能なシナリオ |
通常のポーリング | ラウンドロビン | サポート | 右輪ポーリング | は、外部サービス リクエストと内部サーバーが比較的バランスが取れているシナリオに適しています |
加重ポーリング | 加重ラウンド ロビン | サポート (重み) | ポーリングには異なる重みを設定可能 | サーバー処理能力が異なる、またはカナリアなどのフローを制御したい場合リリース |
ランダムバランス | ランダム | - | サーバーにランダムに割り当て | 外部と内部の両方が非常にバランスが取れている場合、またはランダム割り当ての需要は比較的高い 強力 |
重み付きランダム | 重み付きランダム | - | 重みと組み合わせてサーバーにランダムに割り当てます | ランダム戦略は、重みと組み合わせて調整して、現実の生活によりよく適応できます分配条件 |
応答速度 | 応答時間 | サポート(公平) | サーバーの応答速度に応じて割り当て | この戦略は、サーバーのパフォーマンスとサーバーの現在の動作状況の組み合わせを動的に調整できます。能力のある仕事ができなくなっても、大量のジョブが割り当てられないようにするためのステータス |
最小接続数 | 最小接続数 | 接続数に応じて分散 | タスクが割り当てられているため、ポーリングによってタスクが割り当てられます。ポーリングによる制御は現実的には行えず、タスクの完了速度が確認できないため実サーバーへの反映が発生し、負荷接続数が変動するため、長時間接続サービスを提供する企業に適しています。オンライン カスタマー サービスや FTP/SFTP などのサービス用の WebSocket の実装など、長い時間がかかります。 |
|
DNS 応答 | Flash DNS | - | 他の DNS から返された IP アドレスを無視して、返された最速の DNS 解決結果に基づいてサービスをリクエストし続けます | グローバルな負荷分散を伴う状況に適用されます。例、CDN |
負荷分散のデモンストレーション例: 通常のポーリング
次に、nginx を使用して通常のポーリングを実行する方法を示します:
負荷分散アルゴリズム | 負荷分散アルゴリズム (E) | nginx のサポート またはではありません | 説明 | 適用可能なシナリオ |
通常のポーリング | ラウンドロビン | は、同じ重みを持つ | ポーリングをサポートします | 外部サービスリクエストと内部サーバーの両方が比較的バランスが取れているシナリオに適用 |
事前準備
デモの便宜上、Tornadoを使用してミラーを作成し、表示用に2つのポート7001/7002で2つのサービスを起動しておきます。サービスが異なります。
[root@kong ~]# docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "User Service 1: 7001"ddba0abd24524d270a782c3fab907f6a35c0ce514eec3159357bded09022ee57
[root@kong ~]# docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "User Service 1: 7002"95deadd795e19f675891bfcd44e5ea622c95615a95655d1fd346351eca707951
[root@kong ~]# [root@kong ~]# curl http://192.168.163.117:7001Hello, Service :User Service 1: 7001[root@kong ~]# [root@kong ~]# curl http://192.168.163.117:7002Hello, Service :User Service 1: 7002[root@kong ~]#
ログイン後にコピー
nginxを起動
[root@kong ~]# docker run -p 9080:80 --name nginx-lb -d nginx 9d53c7e9a45ef93e7848eb3f4e51c2652a49681e83bda6337c89a3cf2f379c74
[root@kong ~]# docker ps |grep nginx-lb9d53c7e9a45e nginx "nginx -g 'daemon ..." 11 seconds ago Up 10 seconds 0.0.0.0:9080->80/tcp nginx-lb
[root@kong ~]#
ログイン後にコピー
nginxコードスニペット
以下のnginxコードスニペットを用意し、nginxの/etc/nginx/conf.d/default.confに追加します
http {
upstream nginx_lb { server 192.168.163.117:7001; server 192.168.163.117:7002;
}server {
listen 80;
server_name www.liumiao.cn 192.168.163.117;
location / {
proxy_pass http://nginx_lb;
}
}
ログイン後にコピー
default.confの変更方法
を渡すことができますコンテナに vim をインストールして効果を実現します。ローカルで変更して docker cp 経由で渡すことも、sed で直接変更することもできます。 vimをコンテナにインストールする場合は、次の方法を使用します
[root@kong ~]# docker exec -it nginx-lb sh# apt-get update...省略# apt-get install vim...省略
ログイン後にコピー
変更前
# cat default.confserver {
listen 80;
server_name localhost; #charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html; index index.html index.htm;
} #error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
} # proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}}#
ログイン後にコピー
変更後
# cat default.confupstream nginx_lb { server 192.168.163.117:7001; server 192.168.163.117:7002;
}server {
listen 80;
server_name www.liumiao.cn 192.168.163.117; #charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / { #root /usr/share/nginx/html;
#index index.html index.htm;
proxy_pass http://nginx_lb;
} #error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
} # proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}}#
ログイン後にコピー
nginxコンテナを再起動
[root@kong ~]# docker restart nginx-lbnginx-lb
[root@kong ~]#
ログイン後にコピー
ログイン後にコピー
結果を確認します
ポーリングが順番に実行されていることがはっきりとわかります:
[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7001[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7002[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7001[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7002[root@kong ~]#
ログイン後にコピー
負荷分散デモ例: ウェイトポーリング
これに基づいて、ウェイトポーリングを実行するには、ウェイトを追加するだけで済みます
負荷分散アルゴリズム | 負荷分散アルゴリズム(E) | nginxサポートの有無 | 説明 | 適用可能なシナリオ |
---|
加重ラウンドロビン | 加重ラウンドロビン | サポート(重み) | ポーリングに異なる重みを設定できます | サーバーの処理能力が異なる場合、またはトラフィック制御を実行したい場合, Canary Release |
default.confを変更
default.confを次のように変更
# cp default.conf default.conf.org
# vi default.conf
# diff default.conf default.conf.org
2,3c2,3
< server 192.168.163.117:7001 weight=100;< server 192.168.163.117:7002 weight=200;
---> server 192.168.163.117:7001;
> server 192.168.163.117:7002;
#
ログイン後にコピー
nginxコンテナを再起動
[root@kong ~]# docker restart nginx-lbnginx-lb
[root@kong ~]#
ログイン後にコピー
ログイン後にコピー
結果を確認
1/3と2/に従ってポーリング結果が確認できます3 割合は進行中です:
[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7001[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7002[root@kong ~]# curl http://localhost:9080Hello, Service :User Service 1: 7002[root@kong ~]#
ログイン後にコピー
関連する推奨事項:
nginx 管理構成の最適化
Nginx リバース プロキシ WebSocket 構成例
以上がnginx アプリケーション: 負荷分散に nginx を使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。