OpenResty Edge のレート制限は、カスタムキー(クライアント IP アドレス、URI、URI パラメータ、または Cookie)ごとにリクエストレートを制限し、2 つのしきい値を使用します:超過したリクエストを遅延させるソフトな「Shape at」レートと、それらを直接拒否するハードな「Reject at」レートです。クライアントがリクエストを送信するのが速すぎる場合(例えばサービス拒否攻撃の場合など)、これによりゲートウェイサーバーとオリジンサーバーの両方を保護し、サーバーが過負荷にならないようにします。以下では、レート制限のページルールを段階的に追加し、wrk でテストし、同じ制限を SSL ハンドシェイクに拡張します。

クライアントのリクエストがオリジンサーバーに到達する前にフィルタリングする OpenResty Edge のリバースプロキシ

アプリケーションにリクエストレート制限のページルールを追加する

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

HTTP/HTTPS アプリケーションを一覧表示する OpenResty Edge の Web コンソール

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

アプリケーション一覧内の test-edge.com サンプルアプリケーション

すでにページルールが 1 つ定義されています。

Page Rules セクションを強調表示した OpenResty Edge のアプリケーション概要

このページルールは、事前に定義されたアップストリームにリクエストを転送するリバースプロキシを設定しており、現時点ではリクエストレートの制限はありません。

my_backend アップストリームにプロキシする既存のページルール(レート制限なし)

では、既存のページルールを編集してレート制限を追加しましょう。新しいアクションを追加し、「Limit request rate」を検索します。

ページルールエディタで Limit request rate アクションを検索する

まず、レート制限のキーを指定する必要があります。

Key フィールドがクライアント IP アドレスに設定された Limit request rate アクション

クライアントの IP アドレス、URI、URI パラメータ、Cookie など、さまざまなキータイプが選択可能です。ここでは、デフォルトのキータイプであるクライアント IP アドレスを選択します。これは、個々のクライアント IP アドレスごとに制限を適用することを意味します。

レート制限のキータイプを一覧表示する Key ドロップダウン:クライアント IP アドレス、URI、URI パラメータ、リクエスト Cookie、X-Forwarded-For、リクエストヘッダー

「Shape at」レートはソフトリミットです。クライアントがこのレートよりも速くリクエストを送信しようとすると、ゲートウェイサーバーはこれらの過剰なリクエストを遅延させてこのレートに合わせます。したがって、クライアントがリクエストを送信する速度が速いほど、ゲートウェイが追加する遅延も長くなります。ここでは、毎秒 50 リクエストのレートを指定します。

Shape at ソフトリミットレートが毎秒 50 リクエストに設定されている

キーをクライアント IP アドレスに設定したため、制限は個々のクライアント IP アドレスごとに適用されます。

「Reject at」レートはハードリミットです。クライアントがこのハードリミットを超える速度でリクエストを送信する場合、待機せずに即座にブロックするなど、より積極的なアクションを取ることができます。ここでは、毎秒 100 リクエストのレートを指定します。

Reject at ハードリミットレートが毎秒 100 リクエストに設定されている

さまざまなブロックアクションを選択できます——現在の接続を即座に閉じる、エラーページを返す、またはボットを防ぐためのキャプチャページを返すなどです。デフォルトの「Error Page」(エラーページ)アクションを選択します。これは HTTP を介してエラーページを返します。

Close Connection、Error Page、Enable HCaptcha、Enable Edge Captcha を表示する Reject アクションのドロップダウン

ここではデフォルトの HTTP ステータスコード 503 を使用します。これはサービス利用不可を示します。

Reject アクションのステータスコードがデフォルトの 503 Service Unavailable に設定されている

このページルールへの変更を保存します。次に、いつものように、変更をプッシュするためにリリースします。

リリース待ちの変更がある、設定済みの Limit request rate ページルール

リリースすると、新しいページルールがすべてのゲートウェイサーバーに同期されます。

すべてのゲートウェイサーバーで同期ステータスが 12/12 となったリリース完了

これで、新しいページルールがすべてのゲートウェイクラスターとサーバーにプッシュされました。私たちの設定変更には、サーバーのリロード、再起動、またはバイナリアップグレードは必要ありません。そのため、非常に効率的でスケーラブルです。

OpenResty Edge のリリースがリロードなしですべてのゲートウェイクラスターに同期される図

wrk でレート制限をテストする

次に、新しいレート制限の効果を検証します。

ターミナル上で、wrk というオープンソースツールを使用して、非常に高速に大量のリクエストを送信できます。

wrk -c 50 -d 1s http://test-edge.com/

ここでは、まず並行レベル 50 を使用します。-c オプションに注目してください。

並行レベル 50 で test-edge.com にリクエストを送信する wrk コマンド

このコマンドを実行すると、実際のリクエストレートは約毎秒 50 リクエストになります。これが私たちの「Shape at」レートです。

並行レベル 50 での wrk の結果。約毎秒 47.90 リクエストで、Shape at レートと一致

次に、並行レベルを上げて、wrk がより速くリクエストを送信するようにします。

wrk -c 128 -d 1s http://test-edge.com/

並行レベル 128 に注目してください。

並行レベルを 128 に上げて test-edge.com に対して実行する wrk コマンド

実行します!多くの拒否されたリクエストにエラー応答があることに注意してください。

並行レベル 128 での wrk の結果。超過したリクエストが拒否され、3498 件の非 2xx または 3xx 応答を示す

今回のリクエストレートが高いのは、サーバーが過剰なリクエストを非常に速く拒否しているためです。

並行レベル 128 での wrk の結果。拒否されたリクエストが非常に速く返るため、約毎秒 3539 リクエストを示す

SSL/TLS ハンドシェイクのレート制限

リクエストレートの制限に加えて、OpenResty Edge は HTTPS リクエストの SSL または TLS ハンドシェイクのレートも制限できます。

SSL ハンドシェイクレート制限セクションがある OpenResty Edge の SSL ページ

このページでは、SSL ハンドシェイクのレート制限を設定できます。スイッチをオンにすると、設定パラメータが表示されます。これらのパラメータは、リクエストレート制限機能と同じです——キーを選択し、「Shape at」と「Reject at」のレートを設定します。

クライアント IP キー、Shape at 100、Reject at 200 リクエスト/秒で有効化された SSL ハンドシェイクレート制限

OpenResty Edge レート制限に関するよくある質問

OpenResty Edge のレート制限は、どのリクエストを制限するかをどのように決定しますか?

選択したキーに基づいて制限します。デフォルトのキーはクライアント IP アドレスであるため、制限は個々のクライアント IP アドレスごとに適用されますが、URI、URI パラメータ、リクエスト Cookie、X-Forwarded-For 内のアドレス、またはリクエストヘッダーをキーにすることもできます。

「Shape at」レートと「Reject at」レートの違いは何ですか?

「Shape at」はソフトリミットです:ゲートウェイはレートを超えるリクエストを遅延させてレートに合わせるため、クライアントが速く送信するほど遅延が長くなります。「Reject at」はハードリミットです:クライアントがこれを超えると、ゲートウェイは待機する代わりに、より積極的なブロックアクションを取ります。

レート制限を超えたリクエストはどうなりますか?

ハードリミットのブロックアクションを選択できます:接続を即座に閉じる、エラーページを返す、またはボットを防ぐためのキャプチャページを返す。デフォルトの「Error Page」アクションは HTTP ステータスコード 503(サービス利用不可)を返します。

OpenResty Edge は SSL/TLS ハンドシェイクもレート制限できますか?

はい。リクエストレートに加えて、OpenResty Edge は HTTPS リクエストの SSL または TLS ハンドシェイクのレートも、リクエストレート制限と同じキー、「Shape at」、「Reject at」パラメータを使用して制限できます。

レート制限の変更にはサーバーのリロードや再起動が必要ですか?

いいえ。これらの設定変更には、サーバーのリロード、再起動、またはバイナリアップグレードは必要ありません。リリースを行うと、すべてのゲートウェイクラスターとサーバーに同期されます。

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

翻訳

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