Nginx を使用してグレースケール リリースを実装する

Nginx を使用してグレースケール リリースを実装する

グレースケールリリースとは、白と黒をスムーズに移行できるリリース方法を指します。 ABテストとは、グレースケールのリリース方法で、一部のユーザーはAを使い続け、一部のユーザーはBを使い始めます。ユーザーがBに異論がなければ、徐々に範囲を広げていき、すべてのユーザーをBに移行させます。

グレースケール リリースにより、システム全体の安定性を確保できます。最初のグレースケール リリース中に問題を発見して調整し、その影響を確認することができます。

グレースケールを解放する方法は、一般的に 3 つあります。

  • Nginx+LUA方式
  • Cookieに基づくグレースケールリリース
  • ソースIPに基づくグレースケールリリース

この記事では主に、Cookie とソース IP に基づいてシンプルなグレースケール パブリッシングを実装する方法について説明します。Nginx + LUA 方式は内容が多すぎるため、この記事では詳しく説明しません。

A/B テストのプロセス

NginxはCookieに基づいてグレースケールリリースを実装します

Cookie クエリによると、Cookie キーはバージョンの値です。Cookie 値が V1 の場合は hilinux_01 に転送されます。V2 の場合は hilinux_02 に転送されます。クッキー値が一致しない場合は、デフォルトでhilinux_01に対応するサーバーが使用されます。

2 つのサーバーは次のように定義されます。

  • hilinux_01 192.168.1.100:8080
  • hilinux_02 192.168.1.200:8080

if命令で実装

アップストリームhilinux_01 {
  サーバー 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

アップストリームhilinux_02 {
  サーバー 192.168.1.200:8080 max_fails=1 fail_timeout=60;
}

アップストリームデフォルト{
  サーバー 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

サーバー{
 聞く 80;
 サーバー名 www.hi-linux.com;
 access_log ログ/www.hi-linux.com.log メイン;

 #マッチクッキー
 $group を "default" に設定します。
  $http_cookie の場合、バージョンは V1 です。
    $group hilinux_01 を設定します。
  }

  $http_cookie の場合、バージョンは V2 です。
    $group hilinux_02 を設定します。
  }

 位置 / {            
  proxy_pass http://$グループ;
  proxy_set_header ホスト $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  インデックス index.html index.htm;
 }
 }

マップディレクティブで実装

Nginx でマッピングを構成すると、 $COOKIE_version可以解析出Cookie里面的version字段。 $group は変数であり、{} にはマッピング ルールが含まれます。

バージョン V1 のユーザーがシステムにアクセスする場合、$group は hilinux_01 になります。サーバーで使用する場合、http://hilinux_01 にプロキシされます。バージョン V2 のユーザーがシステムにアクセスする場合、$group は hilinux_02 になります。サーバーで使用する場合、http://hilinux_02 にプロキシされます。クッキー値が一致しない場合は、デフォルトでhilinux_01に対応するサーバーが使用されます。

アップストリームhilinux_01 {
  サーバー 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

アップストリームhilinux_02 {
  サーバー 192.168.1.200:8080 max_fails=1 fail_timeout=60;
}

アップストリームデフォルト{
  サーバー 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

$COOKIE_version $group をマップします {
~*V1$ hilinux_01;
~*V2$ hilinux_02;
デフォルト デフォルト;
}

サーバー{
 聞く 80;
 サーバー名 www.hi-linux.com;
 access_log ログ/www.hi-linux.com.log メイン;

 位置 / {            
  proxy_pass http://$グループ;
  proxy_set_header ホスト $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  インデックス index.html index.htm;
 }
 }

Nginxは受信IPに基づいてグレースケールリリースを実装します

内部 IP の場合、リバース プロキシは hilinux_02 (プレリリース環境) に送信されます。そうでない場合は、リバース プロキシは hilinux_01 (本番環境) に送信されます。

アップストリームhilinux_01 {
  サーバー 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

アップストリームhilinux_02 {
  サーバー 192.168.1.200:8080 max_fails=1 fail_timeout=60;
}

アップストリームデフォルト{
  サーバー 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

サーバー{
 聞く 80;
 サーバー名 www.hi-linux.com;
 access_log ログ/www.hi-linux.com.log メイン;

 $group のデフォルトを設定します。
 ($remote_addr ~ "211.118.119.11") の場合 {
   $group hilinux_02 を設定します。
 }

位置 / {            
  proxy_pass http://$グループ;
  proxy_set_header ホスト $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  インデックス index.html index.htm;
 }
}

サーバーが 1 台しかない場合は、同じ目的を達成するために、異なる IP アドレスに応じて異なる Web サイト ルート ディレクトリを設定できます。

サーバー{
 聞く 80;
 サーバー名 www.hi-linux.com;
 access_log ログ/www.hi-linux.com.log メイン;

 $rootdir を "/var/www/html" に設定します。
  ($remote_addr ~ "211.118.119.11") の場合 {
    $rootdir を "/var/www/test" に設定します。
  }

  位置 / {
   ルート $rootdir;
  }
}

これで、グレースケール リリースを実装するための最も基本的な方法は終了です。よりきめ細かいグレースケール リリースを実行したい場合は、ABTestingGateway プロジェクトを参照してください。

ABTestingGateway は、Sina のオープン ソースの動的ルーティング システムです。 ABTestingGateway は、動的に転送戦略を設定できるグレースケール リリース システムです。レイヤー 7 で動作し、nginx と ngx-lua に基づいて開発されています。転送戦略データベースとして redis を使用し、動的なスケジューリング機能を実装できます。

ABテストゲートウェイ: https://github.com/CNSRE/ABテストゲートウェイ

参照ドキュメント
http://www.google.com
http://www.jianshu.com/p/88f206f48278
http://blog.chinaunix.net/uid-531464-id-4140473.html

Nginx を使用してグレースケール パブリッシングを実装する方法に関するこの記事はこれで終わりです。Nginx グレースケール パブリッシングに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • NginxとLuaによるグレースケールリリースの実装
  • Nginx でグレースケールリリースを実装する 3 つの方法の概要

<<:  Vueはシンプルなスライダー検証を実装する

>>:  MySQL ビューの一貫性を確保する方法の詳細な説明 (チェック オプション付き)

推薦する

CSSはボックスコンテナ(div)の高さを常に100%に設定します。

序文ブラウザをどのようにズームしても、ボックス コンテナーの高さを常に 100% に保つ必要がある場...

ウェブフロントエンドに対する一般的な攻撃とその防止方法

ウェブサイトのフロントエンド開発で発生するセキュリティ問題は、クライアントブラウザで実行されるコード...

Ubuntu 18.04.4 に MySQL をインストールするプロセスの詳細な説明

Ubuntu 18.04.4 に MySQL をインストールするプロセスを見てみましょう。内容は次の...

初心者向けに Docker に Jenkins をインストールする方法を詳しく説明したチュートリアル

Jenkins はオープンソース ソフトウェア プロジェクトです。Java をベースに開発された継続...

Dockerコンテナのk8sデプロイメントの実装

環境: (docker、k8s クラスター)、前回 docker で起動した Java プログラムの...

Reactフックの長所と短所

目次序文アドバンテージ:欠点: 1. レスポンシブな使用効果2. ステータスが同期されていないRea...

jsを使用して中国語からピンインへの変換の完全な手順を実行します

jsを使用して、中国語をピンインに変換するパッケージを作成しました。倉庫のアドレスはpinyin-p...

JS でモバイルのインタラクティブ エクスペリエンスを向上させる方法

目次1. 即時フィードバック1.1 ボタンからの即時フィードバック1.2 継続的なフィードバック1....

MySQL ifnull のネスト使用手順

MySQL ifnull のネストされた使用ifnull をネストする方法があるかどうかオンラインで...

Javascript を使用して、スライドバー効果のあるスライドナビゲーション プラグインを開発します。

目次1. はじめに2. 使用方法3. 開発プロセス1. モデル例2. イベントとアニメーション4. ...

Vue3における非親子コンポーネント通信の詳細な説明

目次最初の方法アプリ.vueホーム.vueホームコンテンツ.vueデータの応答性レスポンシブプロパテ...

HTMLは実際にはいくつかの重要なタグを学ぶアプリケーションです

「これは革命になるだろう」という記事が出たあと。業界の皆様に認知され、もちろん内外からの評価もいただ...

JavaScriptページングコンポーネントの使い方の詳細な説明

ページネーションコンポーネントはWeb開発でよく使われるコンポーネントです。ページネーション機能を実...

HTML におけるメタの役割について (インターネットから収集および分類)

W3Cschoolではこのように説明しています<meta> 要素は、検索エンジン向けの説...

32 典型的な列/グリッドベースのウェブサイト

列ベースの Web デザインのインスピレーションをお探しの場合は、32 個のクラシックな列/グリッド...