nginx を使用してブルーグリーン デプロイメントをシミュレートする方法

nginx を使用してブルーグリーン デプロイメントをシミュレートする方法

この記事では、ブルーグリーン デプロイメントと、nginx を使用してブルーグリーン デプロイメントを最も簡単な方法でシミュレートする方法について説明します。

ブルーグリーンデプロイメント

ブルーグリーンデプロイメントの重要なポイントは次のとおりです。

  • 1. 青バージョンと緑バージョンが同時に存在する
  • 2. 実際の動作環境は青か緑のいずれかであり、スイッチによって制御されます。

長所と短所の分析: 長所は速度とロールバックです。欠点も明らかです。ロールバックが迅速に可能な理由は、環境が同時に 2 セット存在するため、複雑さと必要なリソースが増加するためです。
また、速度は向上しているものの、実装プロセスにおいて、スイッチの制御は、スイッチング速度がいくら速くても、他の技術を組み合わせなければ、完全にシームレスなスイッチングを実現することはできません。

ブルーグリーンデプロイメントのシミュレーション

次に、nginx のアップストリームを使用して、ブルーグリーン デプロイメント シナリオを簡単にシミュレートします。具体的なシナリオは次のとおりです。現在、青色バージョンがアクティブです。nginx 設定を調整することで、緑色バージョンが現在のアクティブ バージョンとして設定されます。

準備

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

docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello blue/green service: v1 in 7001"
docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello blue/green service: v2 in 7002"

実行ログ

[root@kong ~]# docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello blue/green service: v1 in 7001"
70c74dc8e43d5635983f7240deb63a3fc0599d5474454c3bc5197aa5c0017348
[root@kong ~]# docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello blue/green service: v2 in 7002"
6c5c2ea322d4ac17b90feefb96e3194ec8adecedaa4c944419316a2e4bf07117
[root@kong ~]# curl http://192.168.163.117:7001
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7001 の v1
[root@kong ~]# curl http://192.168.163.117:7002
こんにちは、サービス:こんにちはブルー/グリーンサービス:7002のv2
[root@kong ~]#

nginxを起動する

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

nginx コードスニペット

以下の nginx コード スニペットを用意し、nginx の /etc/nginx/conf.d/default.conf に追加します。シミュレーション方法は非常に簡単です。Down はトラフィックがゼロであることを示すために使用されます (nginx では重みをゼロに設定できません)。最初は、トラフィックの 100% がブルー バージョンに送信されます。

http {
アップストリーム nginx_blug_green {
  サーバー 192.168.163.117:7001 重み=100;
  サーバー 192.168.163.117:7002 がダウンしています。
}
サーバー{
  聞く 80;
  サーバー名 www.liumiao.cn 192.168.163.117;
  位置 / {
    proxy_pass http://nginx_blug_green;
  }
}

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_blug_green {
  サーバー 192.168.163.117:7001 重み=100;
  サーバー 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_blug_green;
  }
  #エラーページ 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設定を再読み込み

# nginx -s リロード
2018/05/28 04:39:47 [通知] 321#321: シグナル処理が開始されました
#

結果を確認する

10回の呼び出しすべてが7001でv1を出力しました

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]
> 行う
> http://localhost:9080 をカールします
> cnt++ を使います
> 完了
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7001 の v1
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7001 の v1
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7001 の v1
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7001 の v1
こんにちは、サービス:こんにちはブルー/グリーンサービス:7001のv1
こんにちは、サービス:こんにちはブルー/グリーンサービス:7001のv1
こんにちは、サービス:こんにちはブルー/グリーンサービス:7001のv1
こんにちは、サービス:こんにちはブルー/グリーンサービス:7001のv1
こんにちは、サービス:こんにちはブルー/グリーンサービス:7001のv1
こんにちは、サービス:こんにちはブルー/グリーンサービス:7001のv1
[root@kong ~]#

ブルーグリーンデプロイメント: グリーンバージョンへの切り替え

default.confの重みを調整し、nginx -s reloadを実行することで、nginxサービスを停止せずに動的にグリーンバージョンに切り替えることができます。目標は、すべてのトラフィックを7002でv2に出力することです。

default.conf を変更する方法

アップストリームのサーバーの重みを次のように調整するだけです。

アップストリーム nginx_blug_green {
  サーバー 192.168.163.117:7001 がダウンしています。
  サーバー 192.168.163.117:7002 重み=100;
}

nginx設定を再読み込み

# nginx -s リロード
2018/05/28 05:01:28 [通知] 330#330: シグナル処理が開始されました
#

結果を確認する

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; done
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7002 の v2
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7002 の v2
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7002 の v2
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7002 の v2
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7002 の v2
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7002 の v2
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7002 の v2
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7002 の v2
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7002 の v2
こんにちは、サービス:こんにちは、ブルー/グリーン サービス: 7002 の v2
[root@kong ~]#

要約する

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

以下もご興味があるかもしれません:
  • Docker コンテナのデプロイの試み - マルチコンテナ通信 (node+mongoDB+nginx)
  • uwsgi+nginx を使用した Django プロジェクトのデプロイ例
  • VueとNginxをベースにしたフロントエンドとバックエンドのデプロイメントチュートリアルの詳細な説明
  • 複数のプロジェクトをデプロイする Docker nginx の例
  • Vue プロジェクト nginx を非ルート ディレクトリにデプロイするときに空白が更新される問題を解決する
  • Vue プロジェクトのパッケージ化とデプロイメント_nginx プロキシ アクセス メソッドの詳細説明
  • NGINX を介したサブディレクトリまたはセカンダリディレクトリへの Vue のデプロイメントの詳細な説明
  • nginx で .net core サイトを展開する方法
  • HTTPS ウェブサイトを展開するために SSL 証明書を使用して Nginx を構成する方法 (証明書の発行)
  • nginx ベースの静的 Web ページ展開の実装

<<:  一時ファイルを作成できないために MySQL が起動できない問題を解決する方法

>>:  JavaScriptはシンプルな計算機能を実装します

推薦する

jQueryのanimateアニメーションメソッドとアニメーションキューイング問題の解決方法の詳しい説明

目次animate() アニメーションメソッドアニメーションキューイングdelay() メソッドアニ...

MySQL シリーズ 9 MySQL クエリ キャッシュとインデックス

目次チュートリアルシリーズ1. MySQL アーキテクチャクエリキャッシュキャッシュされないクエリ:...

Dockerは異常なコンテナ操作を排除する

この初心者は、Docker を学び始めたばかりの頃にこのような問題に遭遇しました。記録しておきます。...

固定、流動的、柔軟なウェブページレイアウトの長所と短所の分析

ウェブデザイナーを長い間悩ませてきた疑問があります。それは、固定レイアウト、流動的レイアウト、柔軟レ...

MySQL mysqldump の使い方の詳しい説明

1. mysqldump の紹介mysqldump は、MySQL に付属する論理バックアップ ツー...

TypeScript 環境を構築して VSCode にデプロイする詳細な手順

目次TypeScript環境の構築ステップ1: Taobaoミラーをダウンロードするステップ2: T...

画像を表示したり非表示にしたりするための JavaScript

JavaScriptは画像を表示したり非表示にしたりしますが、参考までに具体的な内容は次のとおりで...

Linuxはデュアルネットワークカードボンドとドライバーインターフェースを使用する

債券とは何かNIC ボンドは、実稼働シナリオでよく使用されるテクノロジーです。複数の NIC を 1...

CSS 向け SASS スタイル プログラミング ガイド

SASS を使用する開発者が増えるにつれて、SASS コードの数に注意する必要があります。 SASS...

Node.jsミドルウェアの仕組みの詳細な説明

目次Express ミドルウェアとは何ですか? Expressミドルウェアを作成するための要件Exp...

CSSはラジオをクリックして2つの画像スタイルを切り替えますが、複数のラジオのうち1つだけをチェックできます。

クリックされたボタンには赤い画像スタイルを実装し、選択されていない他のボタンには灰色の画像スタイルを...

MySQL 10進数符号なし更新負数を0に変換

今日、インターフェースの同時実行の問題を検証したところ、これまでredisで解決していた同時実行のプ...

Docker Compose を使用して nginx のロード バランシングを実装する方法

Dockerネットワーク管理とコンテナIP設定に基づいてNginxロードバランシングを実装するすべて...

Dockerの基本的な手順

目次基本的な指示1. 現在のマシンのコンテナステータスを確認する2. イメージをダウンロードまたは取...