本日は、OpenResty Edge の別の機能についてご紹介します。特別なリクエストヘッダーを使用して、実際のクライアント IP アドレスをバックエンドサーバーに渡す機能です。通常、バックエンドサーバーまたはオリジンサーバーが見るクライアント IP アドレスは、実際のクライアント IP アドレスではなく、ゲートウェイやプロキシサーバーの IP アドレスです。オリジンサーバーが実際のクライアント IP アドレスを必要とする場合、新しいリクエストヘッダーを作成し、その実際のアドレスをヘッダーに配置する必要があります。これにより、バックエンドサーバーは直接リクエストヘッダーを読み取ることができます。

埋め込み画像

アプリケーションのページルールを設定する

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

スクリーンショット

以前の例で使用した test-edge.com アプリケーションを引き続き使用します。

スクリーンショット

そのアプリケーションに移動します。

スクリーンショット

前回のチュートリアルで、すでにアップストリームを作成しています。

スクリーンショット

この「my backend」アップストリームに対して、バックエンドサーバーを定義しました。

スクリーンショット

このバックエンドサーバーの IP アドレスが「.100」で終わっています。後ほどこの IP アドレスを使用します。

スクリーンショット

また、ページルールも既に定義済みです。

スクリーンショット

このページルールは、先ほど確認したアップストリームへのリバースプロキシを設定しています。

スクリーンショット

ここで、クライアント IP を「X-Forwarded-For」リクエストヘッダーとして設定する新しいページルールを追加します。

スクリーンショット

まず、URI「/test-client-ip/」をチェックするルール条件を有効にします。

スクリーンショット

ここに選択可能なすべての変数が表示されています。

スクリーンショット

「URI」を選択します。

スクリーンショット

演算子として「文字列等価」を選択します。

スクリーンショット

スクリーンショット

URI「/test-client-ip/」を入力します。

スクリーンショット

次に、新しいアクションを追加します。

スクリーンショット

ここで検索機能を使用できます。

スクリーンショット

「プロキシヘッダーの設定」を検索します。

スクリーンショット

それを選択します。

スクリーンショット

ヘッダー名として「X-Forwarded-For」を入力します。このような要件に対しては、よく使用されるリクエストです。「X-Real-IP」など、お好みの他の名前を使用することもできます。

スクリーンショット

値のタイプを選択します。リクエストに文字列値を指定することができます。

スクリーンショット

または、OpenResty Edge が提供する組み込み変数を指定することもできます。

スクリーンショット

これらは現在サポートされている組み込み変数の一部で、将来的にはさらに多くの組み込み変数がサポートされる予定です。

スクリーンショット

ここでは「クライアントアドレス」を選択します。

スクリーンショット

ここをクリックして、このルールが既存の通常ルールの前に実行されるようにします。

スクリーンショット

このページルールを保存します。

スクリーンショット

いつものように、先ほどの変更をプッシュするために新しいバージョンをリリースする必要があります。

スクリーンショット

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

スクリーンショット

リリースします!

スクリーンショット

新しいバージョンがすべてのゲートウェイサーバーに同期されました。

スクリーンショット

これで、新しいページルールがすべてのゲートウェイクラスターとサーバーにプッシュされました。

埋め込みビデオ

埋め込みビデオ

これらの設定変更には、サーバーのリロード、再起動、またはバイナリのアップグレードは必要ありません。そのため、非常に効率的でスケーラブルです。

埋め込み画像

テスト

それでは、ゲートウェイサーバーにテストリクエストを送信しましょう。そして、バックエンドサーバーが受け取った「X-Forwarded-For」リクエストヘッダーを確認します。

埋め込み画像

ターミナルを使用して、イギリスのロンドンにあるリモートサーバーにログインします。

スクリーンショット

このサーバーの IP アドレスが「.240」で終わっています。

スクリーンショット

サーバーにログインします。

スクリーンショット

「curl」コマンドラインツールを使用して HTTP リクエストを送信します。

curl http://test-edge.com/test-client-ip/

スクリーンショット

したがって、このリクエストの実際のクライアント IP も「.240」で終わるはずです。

スクリーンショット

サーバーからログアウトします。

スクリーンショット

次に、IP アドレスが「.100」で終わるバックエンドサーバーにログインします。

スクリーンショット

nginx 設定ファイルで定義されているアクセスログの形式を確認します。

cd /usr/local/openresty/nginx/

スクリーンショット

nginx 設定ファイルの最初の 30 行を表示します。

スクリーンショット

「log format」ディレクティブを見つけます。

スクリーンショット

「X-Forwarded-For」ヘッダーの値がアクセスログ情報の最後のフィールドであることに注意してください。

スクリーンショット

バックエンドサーバーのアクセスログファイルの最後の行を確認します。

clear
tail -1 logs/access.log

スクリーンショット

転送されたリクエストの「X-Forwarded-For」ヘッダーが確かに「.240」で終わる IP アドレスであることがわかります。

スクリーンショット

実際のクライアントの IP アドレスがリクエストヘッダーに含まれています。

埋め込み画像

次に、アメリカのサンフランシスコにある別のサーバーにログインします。

スクリーンショット

このサーバーの IP アドレスが「.226」で終わっていることを覚えておいてください。

スクリーンショット

サーバーにログインします。

スクリーンショット

テストリクエストを送信します。

curl http://test-edge.com/test-client-ip/

スクリーンショット

したがって、このリクエストの実際のクライアント IP も「.226」で終わるはずです。

スクリーンショット

サーバーからログアウトします。

スクリーンショット

バックエンドサーバーのアクセスログファイルの最後の行を確認します。

スクリーンショット

予想通り、転送されたリクエストの「X-Forwarded-For」ヘッダーが確かに「226」で終わっています。

スクリーンショット

実際のクライアントの IP アドレスが再びリクエストヘッダーに含まれています。

場合によっては、OpenResty Edge ゲートウェイサーバー自体が別のプロキシの背後にある可能性があります。このような場合、OpenResty Edge も特別なリクエストヘッダーから実際のクライアント IP アドレスを読み取る必要があります。この話題については、別のチュートリアルで取り上げさせていただきます。

Embeded image

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 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

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