ホームページ  >  記事  >  バックエンド開発  >  nginx アプリケーション: 負荷分散に nginx を使用する

nginx アプリケーション: 負荷分散に nginx を使用する

不言
不言オリジナル
2018-06-01 15:15:301878ブラウズ

この記事では、主に nginx のアプリケーションを紹介します。負荷分散に nginx を使用すると、特定の参考値が得られます。必要な友人は参考にしてください。nginx は一般的に 7 層の負荷分散に使用できます。この記事では、負荷分散の基礎知識と、負荷分散に nginx を使用する簡単な例を紹介します。

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

カテゴリOSIモデル層レイヤー2負荷分散MAC層IP層TCP層HTTP層共通ソフトウェアのサポート
説明
MACアドレスに従って応答 3層負荷分散
IPアドレスに応じて応答 4層負荷分散
IPアドレスとポート番号の組み合わせに基づいて応答 7層負荷分散
4層をベースに、URL/ブラウザカテゴリなど7層の情報をもとにさらに応答し続けることが可能

ソフトウェア4層負荷分散nginx軽量実装-F5ハードウェア実装と高コスト--
7層負荷分散
httpとメールをサポート、パフォーマンスはhaproxy haproxy
7層負荷分散をサポート LVS
-
を実装する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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。