24 時間も前に、Cloudflare キャッシュを使用してウェブサイトを高速化する方法についての投稿を書きました。ただし、その後、ロジックの大部分を Redis を使用する Fastify ミドルウェアに移行しました。その理由と、自分で行う方法は次のとおりです。
Cloudflareのキャッシュの問題
Cloudflareキャッシュに関して2つの問題に遭遇しました:
- 応答のキャッシュを有効にするとページ ナビゲーションが壊れました。この件については少し前に Remix フォーラムで問題を提起しましたが、これを書いている時点ではまだ未解決です。応答のキャッシュによってページ ナビゲーションが中断される理由は明らかではありませんが、応答が Cloudflare によってキャッシュされている場合にのみ発生します。
元の投稿で説明されているように、再検証中に古いコンテンツを提供するように Cloudflare を実行させることができませんでした。利用できる機能ではないようです。
他にもいくつか問題が発生しましたが (パターン マッチングを使用してキャッシュをパージできないなど)、それらは私のユースケースにとって重要ではありませんでした。
そこで、Redis を使用してロジックを Fastify ミドルウェアに移動することにしました。
[!NOTE]
画像キャッシュのためにCloudflareキャッシュを残しました。この場合、Cloudflare キャッシュは効果的に CDN として機能します。
Fastify ミドルウェア
以下は、Fastify を使用して応答をキャッシュするために私が作成したミドルウェアの注釈付きバージョンです。
リーリー
コメントでコードを詳しく説明しますが、重要なポイントがいくつかあります:
キャッシュ基準:
-
リクエスト:
認証されたユーザーの応答をキャッシュしないでください。
GET リクエストのみをキャッシュします。
「/supplements/」を含む URL の応答のみをキャッシュします。
リクエストヘッダーにcache-control: no-cacheが含まれている場合はキャッシュをバイパスします。
回答:
成功した応答のみをキャッシュします (statusCode は 200)。
すでにキャッシュから提供されている応答をキャッシュしないでください (x-pillser-cache: HIT)。
content-type: text/html の応答のみをキャッシュします。
キャッシュキーの生成:
-
リクエストメソッド、URL、ビューポート幅を含むJSON表現のSHA-256ハッシュを使用します。
名前空間の設定と削除を容易にするために、キャッシュ キーの先頭に「request:」を付けます。
リクエストの処理:
-
onRequest ライフサイクルにフックして、リクエストにキャッシュされた応答があるかどうかを確認します。
利用可能な場合はキャッシュされた応答を提供し、x-pillser-cache: HIT でマークします。
キャッシュされた応答を送信した後にバックグラウンド タスクを開始してキャッシュを更新し、「再検証中に古いコンテンツを提供する」を実装します。
応答処理:
-
onSend ライフサイクルに接続して、応答を処理してキャッシュします。
キャッシュを簡素化するために、読み取り可能なストリームを文字列に変換します。
特定のヘッダー (content-length、set-cookie、x-pillser-cache) をキャッシュから除外します。
キャッシュ不可能な応答を x-pillser-cache: DYNAMIC としてマークします。
1 日の TTL (Time To Live) で応答をキャッシュし、x-pillser-cache: MISS で新しいエントリをマークします。
結果
いくつかの場所からレイテンシ テストを実行し、各 URL の最も遅い応答時間を取得しました。結果は以下の通りです:
URL
| 国
| オリジンの応答時間
| Cloudflareのキャッシュされた応答時間
| キャッシュされた応答時間を短縮する
|
https://pillser.com/vitamins/vitamin-b1
| us-west1
| 240ミリ秒
| 16ミリ秒
| 40ミリ秒
|
https://pillser.com/vitamins/vitamin-b1
| ヨーロッパ西3
| 320ミリ秒
| 10ミリ秒
| 110ミリ秒
|
https://pillser.com/vitamins/vitamin-b1
| オーストラリア-南東1
| 362ミリ秒
| 16ミリ秒
| 192ミリ秒
|
https://pillser.com/supplements/vitamin-b1-3254
| us-west1
| 280ミリ秒
| 10ミリ秒
| 38ミリ秒
|
https://pillser.com/supplements/vitamin-b1-3254
| ヨーロッパ西3
| 340ミリ秒
| 12ミリ秒
| 141ミリ秒
|
https://pillser.com/supplements/vitamin-b1-3254
| オーストラリア-南東1
| 362ミリ秒
| 14ミリ秒
| 183ミリ秒
|
Cloudflareキャッシュと比較すると、Fastifyキャッシュは遅いです。これは、Cloudflare キャッシュが地域のエッジロケーションから提供されるのに対し、キャッシュされたコンテンツは引き続きオリジンから提供されるためです。ただし、優れたユーザー エクスペリエンスを実現するには、これらの応答時間で十分であることがわかりました。
以上がFastify と Redis Cache を使用して Web サイトを高速化するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。