regex以外のオフロードは、NginxではなくFastlyにリダイレクトします(ルート)
このトピックでは、Adobe Commerce on cloud infrastructureでNginxではなくFastlyにregex以外のリダイレクトをオフロードする際に発生する可能性がある、一般的なリダイレクトのパフォーマンスの問題に対する解決策について説明します。
影響を受ける製品とバージョン
- Adobe Commerce on cloud infrastructure (すべてのバージョン) Fastlyを活用している
Master/Production/Staging環境
イシュー
クラウド インフラストラクチャ上のAdobe Commerceでは、Nginx レイヤーでregex以外の多数のリダイレクト/書き換えを実行できず、パフォーマンスの問題が発生する可能性があります。
原因
.magento/routes.yaml ディレクトリのroutes.yaml ファイルは、Adobe Commerce on cloud infrastructureのルートを定義します。
routes.yaml ファイルのサイズが32 KB以上の場合は、regex以外のリダイレクト/書き換えをFastlyにオフロードする必要があります。
このNginx レイヤーでは、多数のregex以外のリダイレクト/書き換えを処理できないか、パフォーマンスの問題が発生します。
Solution
解決策は、代わりにregex以外のリダイレクトをFastlyにオフロードすることです。 Fastlyにリダイレクトする汎用エラーパスを作成します。
次の手順では、NginxではなくFastlyにリダイレクトを配置する方法について詳しく説明します。
-
Edge辞書の作成。
まず、Adobe Commerce🔗でVCL スニペットを使用して、エッジディクショナリを定義できます。 これにはリダイレクトが含まれます。
これに対する注意事項:
-
Fastlyは、辞書エントリに対してregexを実行できません。 完全一致です。 これらの制限について詳しくは、FastlyのEdge ディクショナリの制限事項に関するドキュメントを参照してください。
-
Fastlyは、1つの辞書に対して1000個のエントリの制限があります。 Fastlyはこの制限を延長できますが、これは3つ目の注意事項につながります。
-
エントリを更新し、すべてのノードにVCLを更新してデプロイすると、ディクショナリを拡張すると、幾何学的な読み込み時間が増加します。つまり、2000 エントリのディクショナリは、実際には1000 エントリのディクショナリよりも3x~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で直接ステージアカウントを設定できます。