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はシンプルな計算機能を実装します

推薦する

JavaScript で配列遅延評価ライブラリを実装する方法

目次概要達成方法具体的な実装評価関数の終了を決定する生成関数の範囲変換関数マップフィルター割り込み機...

VUE+SpringBootはページング機能を実装します

この記事では主に、Vue + SpringBoot でページ分割されたリストデータを実装する方法を紹...

HTML 画像 img にハイパーリンクを追加した後の醜い青い境界線の問題を解決する

HTML画像にハイパーリンクを追加すると醜い青い枠線が表示される次のように:解決: CSS スタイル...

Vueカスタムツリーコントロールの使い方の詳細な説明

この記事では、Vueカスタムツリーコントロールの使い方を参考までに紹介します。具体的な内容は次のとお...

Zabbix を使用して ogg プロセスを監視する (Windows プラットフォーム)

この記事では、Windows プラットフォームで ogg プログラムを監視する方法を紹介します。 (...

Navicat for Mysql 接続エラー 1251 (接続失敗) の問題を解決する

以前書いた内容が詳細さに欠けていたため、今回は修正・補足しました。ただし、以前の MySQL バージ...

Vueで配列の変更を監視する方法

目次序文ソースコード学習の第一歩はどこから始めればよいでしょうか?写真から始めましょうソースコードを...

HTML で margin:0 auto を使用するとページ全体が中央に配置されない問題の解決方法

今日、jsp ページを書きました。<div style="margin:0 auto...

HTML 要素に注釈を付けるときにクラスと ID のどちらが優れているかを分析する

Web ページには、非常に複雑な HTML 構造があります。CSS を使用して関連するスタイルを定義...

Docker で Docker0 ブリッジのデフォルトのネットワーク セグメントを変更する方法

1. 背景Docker サービスが開始されると、デフォルトで docker0 ブリッジが作成され (...

HTML の一般的でないタグ optgroup、sub、sup、bdo のサンプルコード

Optgroup は、ドロップダウン リストのコンテンツをより整理するために、select タグで使...

初心者がHTMLタグを学ぶ(3)

関連記事:初心者が学ぶ HTML タグ (2)導入された HTML タグは、必ずしも XHTML 仕...

::before/:before と ::after/:after の使用に関する深い理解

パート1: 基礎1. :active や :hover などの疑似クラスとは異なり、これらはすべて疑...

Navicat が MySql サーバーにリモート接続できない問題の解決策

Navicat が MySql サーバーにリモート接続できない問題の解決策は、先頭に書かれています:...