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

推薦する

MySQL サービス 1067 エラーの解決策: mysql 実行可能ファイルのパスを変更する

今日、MySQLサービス1067エラー問題に遭遇しました。システムアカウントを使用するように設定して...

Dockerはコード検出プラットフォームSonarQubeを構築し、Mavenプロジェクトのプロセスを検出します

1 はじめに優れたコーディング習慣は優れたプログラマーが備えるべき資質ですが、コードの品質を保証する...

インターフェースなしで Centos7 に JDK と Tomcat をデプロイするチュートリアル

1. xshell6をインストールする2. サーバー接続を作成し、ユーザー名とパスワードを入力します...

MySQL がエラーを報告: ファイルが見つかりません: './mysql/plugin.frm' 解決策

問題を見つける最近、仕事中に問題が見つかりました。問題は、MySQL ディスクがいっぱいだったことで...

Win10にnginxをインストールして設定するプロセス

1. はじめにNginx は、無料のオープンソースの高性能 HTTP サーバーおよびリバース プロキ...

Vue の get リクエストと post リクエストの違いのまとめ

このチュートリアルの動作環境: Windows 7 システム、vue 2.9.6 バージョン、DEL...

HTML ユーザー登録ページ設定ソースコード

上記の Web ページをデザインします。 <!DOCTYPE html> <htm...

Vue+echarts でプログレスバーのヒストグラムを実現

この記事では、プログレスバーヒストグラムを実現するためのvue+echartsの具体的なコードを参考...

MySQL で重複レコードを見つけて削除する方法

みなさんこんにちは。私は技術の話ばかりして髪を切らない先生のトニーです。何らかの歴史的な理由や誤操作...

よく忘れられがちな CSS のヒント 26 選

これは、よく使われるけれども忘れられがちな CSS 実装方法のコレクションです。抜けや追加があれば、...

TypeScript をインストール、使用、自動コンパイルする方法に関するチュートリアル

1. TypeScriptの紹介前回の記事ではTypeScriptのインストール、使い方、自動コンパ...

MySQLで行または列をソートする方法

方法:説明: どちらも達成できません:方法1: sp_product から sp.productid...

Linuxのファイル権限の詳細な紹介

Linux の優れた点は、マルチユーザー、マルチタスク システムにあります。 Linux では通常、...

Nofollowタグの書き方と使い方

「nofollow」タグは数年前に Google、Yahoo、Microsoft によって提案されま...

Docker Swarm サービス オーケストレーション コマンドの詳細な説明

1. はじめにDocker には、タスクを構成する複数の Docker コンテナをオーケストレーショ...