本日は、OpenResty Edge で SNI 拡張機能を持つ TLS 接続のリバースプロキシを設定する方法をご紹介します。Edge サーバーは 4003 ポートをリッスンし、リクエストの SNI 名に基づいて、google.com または ebay.com にリクエストをプロキシします。

Embeded image

SNI Proxy タイプのアプリケーションを作成する

まずは OpenResty Edge の Admin Web コンソールにアクセスしましょう。これは私たちのコンソールのサンプルデプロイメントです。各ユーザーは独自のローカルデプロイメントを持っています。

スクリーンショット

Stream タイプのアプリケーションを作成します。

Stream アプリケーションリストページを選択します。

スクリーンショット

新しいアプリケーションを作成します。

Screenshot

Stream アプリケーションには SNI Proxy と TCP の2種類があることがわかります。

スクリーンショット

デフォルトで選択されているのは SNI Proxy タイプで、これが本日のテーマです。

スクリーンショット

TCP アプリケーションは別のチュートリアルで紹介されています。

スクリーンショット

ドメイン名として “www.google.com” を入力します。

Screenshot

このビデオでは、異なる SNI 名を持つリクエストを処理する必要があります。そのため、複数のドメイン名が必要です。

このボタンをクリックして、2 つ目のドメイン名 www.ebay.com を追加します。

Screenshot

Screenshot

このアプリケーションを作成します。

スクリーンショット

このアプリケーションのアップストリームとページルールを作成する

アップストリームページに移動します。

スクリーンショット

新しいアップストリームを作成します。

スクリーンショット

このアップストリームに名前を付けます。例えば、“google” とします。

Screenshot

ここで Google のホスト名を入力します。

スクリーンショット

ポート番号 443 を入力します。

スクリーンショット

このアップストリームを保存します。

スクリーンショット

次に 2 つ目のアップストリームを作成します。

スクリーンショット

このアップストリームを “eBay” と名付けます。

Screenshot

ここに eBay のホスト名を入力します。

スクリーンショット

ポート番号 443 を入力します。

スクリーンショット

このアップストリームを保存します。

スクリーンショット

アップストリームリストページに「google」と「eBay」が表示されています。

スクリーンショット

次に、これらのアップストリームを使用するページルールを作成します。

Screenshot

最初のページルールを作成します。

スクリーンショット

このページルールには条件を指定する必要があります。

スクリーンショット

ここで条件の変数名を選択できます。

スクリーンショット

リクエストの SNI 名に基づいてプロキシするアップストリームを選択するので、変数名は SNI サーバー名にする必要があります。

SNI を検索します。

スクリーンショット

SNI サーバー名を選択します。

Screenshot

演算子はデフォルトの String= のままにしておきます。

スクリーンショット

値の型は String にする必要があります。

スクリーンショット

値として “www.google.com” を入力します。

スクリーンショット

プロキシターゲットを追加します。

スクリーンショット

先ほど作成した最初のアップストリームを選択します。

Screenshot

Screenshot

ここにはいくつかのバランシング戦略が選択可能です。

スクリーンショット

アップストリームにはサーバーが1つしかないため、どのバランシング戦略を選んでも重要ではありません。

スクリーンショット

デフォルトのラウンドロビン戦略のままで構いません。

スクリーンショット

公共ネットワークを介してこのアップストリームにアクセスするため、ここですべてのタイムアウト時間を 60 秒に設定します。

スクリーンショット

このページルールを作成します。

Screenshot

次に、もう1つのページルールを作成します。

スクリーンショット

このルールにも条件を指定します。

スクリーンショット

条件の変数名は引き続き SNI サーバー名です。

Screenshot

Screenshot

Screenshot

値として “www.ebay.com” を入力します。

スクリーンショット

プロキシターゲットを追加します。

スクリーンショット

先ほど作成した 2 つ目のアップストリームを選択します。

スクリーンショット

スクリーンショット

すべてのタイムアウト時間を 60 秒に変更します。

スクリーンショット

このページルールを作成します。

Screenshot

プロキシページルールがページルールリストページに表示されていることがわかります。

スクリーンショット

最後のステップは、新しい設定をリリースすることです。先ほどの変更をすべてのゲートウェイサーバーにプッシュします。

スクリーンショット

このボタンをクリックして新しいリリースを行います。

スクリーンショット

リリースします。

Screenshot

変更がすべてのゲートウェイサーバーに同期されました。このサンプルデプロイメントでは、ゲートウェイネットワークに14台のサーバーがあることがわかります。

スクリーンショット

ネットワーク全体で増分的な設定同期を行っています。

Embeded video

Embeded video

Embeded video

リクエストの粒度でリアルタイムに設定を更新しています。アプリケーションレベルの設定変更はすべて、サーバーのリロード、再起動、またはバイナリアップグレードを必要としません。そのため、多くの異なるユーザーが頻繁にリリースを行っても、スケーラビリティが高くなっています。

埋め込み画像

図に示すように、リッスンポートとして 4003 を使用します。まず、このポートをアプリケーションのパーティションに追加します。

埋め込み画像

ゲートウェイパーティションページに移動します。

スクリーンショット

ゲートウェイパーティションページを開きます。現在はパーティションリストページにいます。多くのパーティションが既に存在していることがわかります。

Screenshot

「default」パーティションに SNI Proxy タイプのポートを追加します。

スクリーンショット

このボタンをクリックします。

スクリーンショット

ポートを追加します。

スクリーンショット

リストの一番上に新しい行が表示されていることがわかります。

スクリーンショット

ポート番号として 4003 を入力します。

Screenshot

タイプとして SNI Proxy を選択します。

スクリーンショット

保存をクリックします。

スクリーンショット

新しいポートがデフォルトパーティションに正常に追加されたことがわかります。

スクリーンショット

このパネルを閉じます。

Screenshot

SNI Proxy タイプのアプリケーションをテストする

次に、ゲートウェイクラスターページに移動し、テスト用の Edge サーバーを1つ選択しましょう。

スクリーンショット

アメリカにあるノードを選択します。IP アドレスが .84 で終わるものに注目してください。

スクリーンショット

このサーバーを使用して、先ほど追加したページルールをテストします。

SNI 名 www.google.com を使用して、curl リクエストを送信します。

curl -I --resolve www.google.com:4003:3.131.85.84 https://www.google.com:4003

Screenshot

サーバーが確かに Google であることがわかります。これは、先ほど追加したページルールが機能していることを意味します。SNI 名が “www.google.com” のリクエストが正しいアップストリームにプロキシされました。

スクリーンショット

次に、SNI 名が “www.ebay.com” の別の curl リクエストを送信します。

curl -I --resolve www.ebay.com:4003:3.131.85.84 https://www.ebay.com:4003

Screenshot

サーバーが eBay であることがわかります。2 つ目のページルールも機能しています。

スクリーンショット

次に、ブラウザを使用してテストを行います。まず、マシンの Host バインディングを確認しましょう。

cat /etc/hosts

Screenshot

Host バインディングが正しいことがわかります。

スクリーンショット

次に、ブラウザで Google にアクセスします。

スクリーンショット

eBay にアクセスします。

Screenshot

OpenResty Edge について

OpenResty Edge は、マイクロサービスと分散トラフィックアーキテクチャ向けに設計された多機能ゲートウェイソフトウェアで、当社が独自に開発しました。トラフィック管理、プライベート CDN 構築、API ゲートウェイ、セキュリティ保護などの機能を統合し、現代のアプリケーションの構築、管理、保護を容易にします。OpenResty Edge は業界をリードする性能と拡張性を持ち、高並発・高負荷シナリオの厳しい要求を満たすことができます。K8s などのコンテナアプリケーショントラフィックのスケジューリングをサポートし、大量のドメイン名を管理できるため、大規模ウェブサイトや複雑なアプリケーションのニーズを容易に満たすことができます。

著者について

章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。

章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay動的トレーシング技術を利用した非侵襲的な障害分析および排除ツール)と OpenResty Edge(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

英文版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!