非正規表現のオフロードにより、Nginx (ルート)ではなく Fastly にリダイレクトされる
このトピックでは、クラウドインフラストラクチャ上のAdobe Commerceで非正規表現リダイレクトを Nginx ではなく Fastly にオフロードする場合に発生する可能性がある、一般的なリダイレクトパフォーマンスの問題に対する解決策を示します。
影響を受ける製品とバージョン
- Fastly を活用したクラウドインフラストラクチャー上のAdobe Commerce(すべてのバージョン)
Master/Production/Staging
環境
問題
クラウドインフラストラクチャー上のAdobe Commerceでは、Nginx レイヤーで多数の非正規表現リダイレクト/書き換えを行うことができず、その結果、パフォーマンスの問題が発生する可能性があります。
原因:
.magento/routes.yaml
ディレクトリの routes.yaml
ファイルは、クラウドインフラストラクチャ上のAdobe Commerceのルートを定義します。
routes.yaml
ファイルのサイズが 32 KB 以上の場合は、非正規表現のリダイレクト/書き換えを Fastly にオフロードする必要があります。
この Nginx レイヤーは、多数の非正規表現リダイレクト/書き換えを処理できません。処理しないと、パフォーマンスの問題が発生します。
解決策
解決策は、これらの非正規表現リダイレクトを Fastly にオフロードすることです。 Fastly にリダイレクトする汎用のエラーパスを作成します。
以下の手順では、Nginx ではなく Fastly にリダイレクトを設定する方法について詳しく説明します。
-
Edge Dictionary を作成します。
まず、Adobe Commerceの VCL スニペットを使用して、エッジディクショナリを定義できます。 これはリダイレクトを含みます。
いくつかの注意点を次に示します。
-
Fastly では、辞書のエントリに対して正規表現を行うことはできません。 完全に一致するだけです。 これらの制限について詳しくは、 エッジ辞書の制限に関する Fastly のドキュメントを参照してください。
-
Fastly には、1 つの辞書に入力できるエントリは 1000 個までに制限されています。 Fastly はこの制限を拡大できますが、それは 3 番目の注意事項につながります。
-
エントリを更新し、更新された VCL をすべてのノードに配置するたびに、ディクショナリの拡張によりジオメトリのロード時間が長くなります。つまり、2000 エントリのディクショナリのロードは、1000 エントリのディクショナリのロードより 3 倍~4 倍遅くなります。 ただし、これは VCL をデプロイする(ディクショナリを更新する、または VCL 関数コードを変更する)場合にのみ問題になります。
リクエストの処理に Fastly にかかる時間には影響しません。新しい設定のプッシュに Fastly にかかる時間に影響するだけです。
一般的に、設定の変更には平均して数秒かかり、通常は 5~10 秒以内です。 したがって、ディクショナリ項目の 2 倍の増加は、設定がロールアウトされるまで 30 秒以上かかります。 4 倍の増加には 2 分近くかかります。 これにより、4 つ目の注意事項が追加されます。
-
エッジディクショナリへのエントリは 10,000 個というかなり厳しい制限があります。
リダイレクトリストを整理することを強くお勧めします。 複数の辞書を使用できますが、VCL に対して行う更新は、Fastly 全体で実際に入力されるまでに数分かかることに注意してください。
-
-
URL を辞書と比較します。
URL 検索が発生すると、一致するものが見つかった場合に、カスタムエラーコードを適用するように比較が行われます。
別の VCL スニペットを使用して、次のようなものを
vcl_recv
に追加します。code language-none declare local var.redir-path STRING; set var.redir-path = table.lookup(redirects, std.tolower(req.url), ""); if (var.redir-path != "") { error 912 var.redir-path; }
ここでは、URL がテーブルエントリに存在するかどうかを確認しています。 その場合、内部 Fastly エラーを呼び出し、そのエラーにテーブルからのリダイレクト URL を渡します。
-
リダイレクトの管理。
一致が見つかった場合は、その
obj.status
に対して定義されているアクション(この場合は 301 永続的な移動リダイレクト)が実行されます。vcl_error
で最終的なスニペットを使用して、301 エラーコードをクライアントに送り返します。code language-none if (obj.status == 912) { set obj.http.location = obj.response; set obj.status = 301; set obj.response = "Moved Permanently"; return(deliver); }
このブロックでは、
vcl_recv
から渡されたエラーコードが一致するかどうかを確認しています。一致する場合は、渡されたエラーメッセージの場所を設定し、ステータスコードを 301 に、メッセージを「永続的に移動」に変更します。 この時点で、応答はクライアントに戻る準備ができているはずです。
ステージサービス
Adobe Commerce ステージング環境を実行しないが、これらのリダイレクトの外観を確認したい場合は、Fastly で直接ステージアカウントを設定できます。
関連資料
- Fastly VCL リファレンス
- 開発者向けドキュメントの ルートの設定を参照してください。
- Fastly の設定については、開発者向けドキュメントを参照してください。
- 開発者向けドキュメントの VCL 正規表現チートシート。