OpenResty Edge のミラーリクエスト:本番トラフィックをテスト・WAF・監査バックエンドに複製、メインリクエストを遅延させずに
OpenResty Edge のミラーリクエスト(Mirror Request)機能は、受信した各リクエストのコピーを 1 つ以上のバックエンドサーバーに送信し、その間メインリクエストは影響を受けずに処理を続けます。同期モードではメインリクエストはミラーの完了を待ってから応答し、非同期モード(v25.12.1-1 で新規追加)では即座に応答します。リクエストボディの転送とカスタム Lua コールバックを組み合わせることで、メインリクエストに遅延を加えることなく、本番トラフィックをテスト・WAF・監査バックエンドに複製できます。
本記事では、リクエストミラーリングとは何か、いつ使うのか、そして OpenResty Edge での設定手順を順を追って解説します。
なぜミラーリクエストを使うのか?セキュリティ・A/B テスト・低遅延ログ
OpenResty Edge のミラーリクエスト機能は、あたかもメインリクエストに「分身の術」を備え付けるかのようです。これは、メインリクエストを処理するのと同時に、一つまたは複数のサブ(ミラー)リクエストを生成します。これらの「分身」は、元のリクエストのコピーを携え、事前に設定されたバックエンドサーバーへ赴き、様々な舞台裏のタスクを実行します。非同期モードでは、メインリクエストは一切の妨げを受けることなく迅速に応答でき、ユーザーエクスペリエンスに影響を与えることはありません。
セキュリティとコンプライアンスの強化:ミラーリクエスト機能は、Web アプリケーションファイアウォール(WAF)のスキャンや認証処理を非同期で行うことで、メインリクエストの低遅延を実現します。これにより、ユーザーエクスペリエンスを損なうことなく、金融、E コマースなどの業界が要求する厳格なセキュリティおよびコンプライアンス要件を満たし、顧客の信頼とビジネス効率を著しく向上させます。
柔軟なビジネスプロセスオーケストレーション:ミラーリクエスト機能により、コアビジネスに影響を与えることなく、リアルタイムデータを監視、分析、A/B テスト、カナリアリリースなどの多様なシナリオに効率的に適用することが可能になります。高可用性エッジアプリケーションの構築に強力なサポートを提供いたします。
究極のパフォーマンスとユーザーエクスペリエンス:非同期ミラーモードを導入することで、メインリクエストはログ記録やデータ統計などの補助的なバックエンドタスクの完了を待つ必要がなくなり、クライアントへの即時応答を実現します。このメカニズムはメインリクエストの遅延を大幅に削減し、ユーザーがより迅速でシームレスなアプリケーション体験を享受できるようにいたします。
OpenResty Edge はどのようにリクエストをミラーリングするのか?
ミラーリクエストの強力さは、OpenResty Edge の基盤となる卓越したリクエスト処理能力に起因しています。これは、リクエストライフサイクルの重要な段階で巧妙にサブリクエストを生成し、元のリクエストを正確に複製し、高効率で転送することを実現しています。
お客様の多様で複雑なビジネスニーズに応えるために、非常に豊富な設定オプションを提供しております:
- タイプ(RAW / CUSTOM):元のリクエストを直接ミラーリングする(RAW)ことも、カスタム Lua モジュール(CUSTOM)を通じて深くカスタマイズし、リクエスト内容の変更や条件判断などの高度なロジックを実現することも可能です。
- 非同期ミラーリングモード(v25.12.1-1 新規追加):このオプションを有効にすると、メインリクエストはミラーリクエストの完了を待つ必要がなく、メインリクエストとミラーリクエストの実行が完全に分離され、応答速度が大幅に向上します。これは高性能エッジコンピューティングを実現するための鍵となります。
- リクエストボディの転送(v25.12.1-1 新規追加):元のリクエストのリクエストボディをミラーサーバーに転送することを許可します。これは、完全なリクエスト内容が必要な WAF やログシステムにとって非常に重要です。セキュリティ監査やデータ分析などのシナリオにおけるミラーリクエストの適用範囲を大幅に拡大します。
- 柔軟なアップストリーム選択と負荷分散:ミラーリクエストのターゲットアップストリームサーバーを指定し、Hash、Chash、Roundrobin などのさまざまな負荷分散アルゴリズムを選択できます。
- 包括的なフォールトトレランス機能:リトライ回数、送信 / 読み取り / 接続のタイムアウト時間を設定でき、デフォルトでファストフェイル機構(ヘルスチェックと連動)を有効にし、高負荷やバックエンドサービスの異常時におけるシステムの安定性を確保します。
OpenResty Edge v25.12.1-1 バージョンでは、非同期ミラーリングモードとリクエストボディ転送機能の重要な強化が導入されました。本バージョンはすでにリリースされていますので、ぜひ最新機能をお試しください。
カスタムミラーリングのための Lua コールバック関数
OpenResty Edge は、強力なカスタマイズ機能を提供し、専用の Lua モジュールを作成することを可能にします。
before_mirror、mirror_rewrite、mirror_header_filter などの一連の精巧に設計されたコールバック関数を通じて、ミラーリクエストの各重要な段階で深く介入することができます。これは、リクエストの内容に基づいてミラーをスキップするかどうかをインテリジェントに判断し、ミラーリクエストのヘッダー情報を柔軟に変更し、さらにはミラーリクエストが完了した後にカスタムの特定の操作を実行することができることを意味します。
この包括的な柔軟性は、開発者に力を与え、さまざまな複雑なビジネスニーズに応じてミラーの動作を正確にカスタマイズする手助けをすることを目的としています。
OpenResty Edge でのミラーリクエストの設定方法
ミラーリクエスト機能の設定は非常に直感的で、以下は主な手順です:
- グローバル Lua モジュールの追加(オプション、CUSTOM タイプ用):
local _M = {} function _M.before_mirror(ctx) local content_length = tonumber(ngx.var.content_length) if content_length and content_length > 4096 then return ngx.DONE -- ミラー操作をスキップ end return ngx.OK end function _M.mirror_rewrite(ctx) ngx.req.set_header('X-Real-IP', tostring(ngx.var.remote_addr)) end function _M.mirror_header_filter(ctx) ngx.log(ngx.ERR, "in mirror_header_filter") end function _M.mirror_body_filter(ctx) ngx.log(ngx.ERR, "in mirror_body_filter") end function _M.after_mirror(ctx, resp) ngx.header['mirror-response-body'] = resp.body end function _M.header_filter() ngx.log(ngx.ERR, "in main request header filter") end function _M.body_filter() ngx.log(ngx.ERR, "in main request body filter") end return _M
コールバック関数の説明:
before_mirror:サブリクエスト作成前に呼び出され、ngx.DONEを返すことでミラー操作をスキップできます。mirror_rewrite:サブリクエストのrewrite段階で呼び出され、サブリクエスト情報を変更できます。mirror_header_filter:サブリクエストのheader_filter段階で呼び出され、サブリクエストのレスポンスヘッダーを変更できます。mirror_body_filter:サブリクエストのbody_filter段階で呼び出され、サブリクエストのレスポンスボディを変更できます(非同期モードでは呼び出されません)。after_mirror:サブリクエスト完了後に呼び出されます(非同期モードでは呼び出されません)。header_filter:メインリクエストのheader_filter段階で呼び出されます。body_filter:メインリクエストのbody_filter段階で呼び出されます。
ミラーサーバーの追加: OpenResty Edge の管理画面で、ミラー対象のアップストリームサーバーを設定します。
ページルールの設定: ページルールでミラーリクエストアクションを有効にし、該当する設定パラメータと Lua モジュール(CUSTOM タイプを使用する場合)を選択します。
リクエストのテスト:
$ curl http://test.com -v # レスポンス結果にはミラーサーバーのレスポンス内容が含まれます。例えば: # mirror-response-body: i am mirror server
ミラーリクエスト機能の具体的な実装詳細や高度な応用シナリオにご興味がある場合は、OpenResty Edge の ミラーリクエスト ドキュメントをご覧ください。
よくある質問
リクエストミラーリングとは何ですか?
リクエストミラーリング(トラフィックシャドウイングとも呼ばれます)は、本番のリクエストのコピーを 1 つ以上のセカンダリバックエンドに送信して追加処理を行い、その間、元のリクエストは通常どおり処理される仕組みです。デフォルトでは、ミラーのレスポンスはメインのレスポンス経路に影響を与えません。OpenResty Edge では after_mirror コールバックを使って、そのレスポンスを任意で取得することもできます。本番トラフィックをテスト・WAF・監査サーバーに複製する用途でよく使われます。
リクエストミラーリングはメインリクエストを遅くしますか?
非同期モードでは遅くしません。OpenResty Edge の非同期ミラーリングモード(v25.12.1-1 で新規追加)はミラーとメインリクエストを完全に分離するため、メインリクエストは待つことなく即座に応答します。同期モードでは、メインリクエストはミラーの完了を待ってから応答します——メインの応答を返す前にミラーの結果が必要な場合はこちらが適切です。
リクエストボディをミラーサーバーに転送できますか?
はい。リクエストボディの転送(Forward Request Body)オプション(v25.12.1-1 で新規追加)は、元のリクエストのボディをミラーリクエストと一緒に送信します。完全なリクエスト内容を必要とするセキュリティ監査やデータ分析向けの WAF・ログシステムにとって不可欠です。
OpenResty Edge のミラーリクエストは nginx の mirror モジュールと何が違いますか?
OpenResty Edge は管理コンソールのページルールでリクエストをミラーリングし——nginx の設定を書き換える必要はありません——さらに素の ngx_http_mirror_module にはない機能を備えています:非同期モード、リクエストボディの転送、カスタム Lua コールバック(before_mirror、mirror_rewrite など)、アップストリーム選択と負荷分散、そしてリトライ・タイムアウト・ファストフェイルのヘルスチェックによる組み込みのフォールトトレランスです。
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、LuaJIT、GDB、SystemTap、LLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。
翻訳
英文版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!


















