キャッシュHIT率を向上させ効果的にCDNを利用する

2022.02.28

J-Stream CDNext

パフォーマンス改善

CDN

CDN(content delivery network)がオリジンサーバーに代わってコンテンツの配信を行った割合のことをキャッシュHIT率と呼びます。キャッシュHIT率はCDNを効率的に利用できているか否かを測る指標となります。キャッシュHIT率に影響する要素と、キャッシュHIT率の向上をサポートする「J-Stream CDNext」の機能についてご紹介します。

1. キャッシュHIT率とは何か

CDNはクライアントからのリクエストに対して、オリジンサーバーからレスポンスされたコンテンツをキャッシュサーバーでキャッシュし、キャッシュされたコンテンツをキャッシュサーバーからクライアントに配信するシステムです。

Jストリームで提供するCDNサービス「J-Stream CDNext」は、クライアントからの特定のコンテンツへのリクエストをきっかけに、オリジンサーバーへそのコンテンツを取得しに行き、レスポンスされたコンテンツをキャッシュします。最初のリクエストは「J-Stream CDNext」を経由してオリジンサーバーへ到達することになりますが、以降のリクエストには「J-Stream CDNext」がキャッシュしたコンテンツを配信するため、オリジンサーバーはリクエスト処理とコンテンツ配信にかかる負荷を受けなくなります。

CDNを利用していても、必ず全てのリクエストにCDNだけで応答出来るわけではありません。
クライアントからのリクエストに対して、オリジンサーバーからのコンテンツのレスポンス無しに、CDNが保持しているキャッシュコンテンツのみで応答できた割合のことをキャッシュHIT率と呼びます。キャッシュHIT率はWebサイトの作りやオリジンサーバーの設定などの影響を受ける場合があります。

キャッシュHITしていない通信とキャッシュHITしている通信

キャッシュHIT率が高い/低いと?

キャッシュHIT率が高ければ、CDNがキャッシュしているコンテンツをレスポンスすることで、本来オリジンサーバーにかかってしまう配信負荷をCDNが高い割合で肩代わりできたということになります。CDNの正当な利用価値を享受できている状態です。
反対にキャッシュHIT率が低いということは、クライアントからのリクエストにCDNだけで応答することが出来ず、オリジンサーバーの稼働が比較的多く発生してしまったということになります。つまり、オリジンサーバーの負荷軽減、配信コスト削減のために利用しているCDNを十分に活用できていないということを表します。CDNを効果的に利用するには、キャッシュHIT率をなるべく高めるようなチューニングを意識的に行うことが重要です。

2. Last-Modified/Etagヘッダの利用と注意

オリジンサーバー側で設定するHTTPレスポンスヘッダによって、オリジンサーバーの配信負荷を抑えることが出来る場合があります。
「Last-Modifiedヘッダ」と「Etagヘッダ」は、どちらもクライアントが現在持っているキャッシュが最新であるかどうかを確認するヘッダです。既にクライアントが持っているキャッシュが最新であれば、わざわざオリジンサーバーからコンテンツを取得する必要はないので、オリジンサーバーの配信負荷を抑えることが出来ます。ただしこれらの利用によってキャッシュHIT率の低下を招く場合があるので注意が必要です。

Last-Modifiedヘッダ

Last-Modifiedヘッダは、Webサーバーからクライアントにコンテンツを最後に更新した時刻を送信するヘッダです。クライアントは次回のリクエスト時、この時刻をHTTPリクエストヘッダに含んで送信します。その時刻が最新であれば、クライアントが現在キャッシュしているコンテンツが最新版ということになるので、Webサーバーはコンテンツの配信を行わず、HTTPステータスコード304(未更新)のみを返答し、クライアントはキャッシュコンテンツを利用します。304の応答によるサーバー負荷もゼロではありませんが、コンテンツそのものをレスポンスするよりも負荷は小さく抑えられます。

J-Stream CDNextの場合

J-Stream CDNext」の場合、CDNがそのコンテンツのキャッシュを最新版として保持する期間であるキャッシュTTLを超過した後にクライアントからのリクエストを受け取ると、オリジンサーバーに対して、Last-Modifiedとして記録されている時刻が最新であるかどうかの確認を含んだリクエストを行います。最新の場合、オリジンサーバーから304が返り、「J-Stream CDNext」がそれまで最新としていたキャッシュコンテンツを改めて最新版としてクライアントへ配信します。最新でなかった場合はオリジンサーバーから最新コンテンツを受け取り、新たにキャッシュし配信します。

Last-Modifiedヘッダ、J-Stream CDNextの場合

Etagヘッダ

EtagヘッダもLast-Modifiedヘッダと同じく、クライアントが現在持っているキャッシュコンテンツが最新版であるかどうかを確認するためにWebサーバーからレスポンスされるヘッダ情報です。Etagヘッダの場合はWebサーバーからレスポンスされる情報が時刻ではなく文字列であり、クライアントが持っている文字列がWebサーバー側の最新版コンテンツと一致するか否かで、クライアントが持っているキャッシュコンテンツが最新版であるか否かを判断します。「J-Stream CDNext」の振る舞いはLast-Modifiedヘッダと同じです。

キャッシュHIT率に影響を与える注意点

Last-ModifiedヘッダもEtagヘッダも適切に利用すればCDNの配信効率を向上させ、オリジンサーバーの配信負荷を削減できるものですが、反対にキャッシュHIT率の低下を招く場合もあります。

Last-Modifiedヘッダはオリジンサーバーからレスポンスされた時刻によってキャッシュコンテンツが最新のものであるか判断するものです。例えばオリジンサーバーが自動でファイルを更新する仕様だった場合、常に時刻が新しくなるので、CDNも常に古いキャッシュを持っている状態となってしまいます。その結果、CDNのキャッシュTTLが切れる度にオリジンサーバーへコンテンツの取得を行わなければなりません。この場合はWebサイト/サーバーの仕様やCDNの設定の見直しが必要です。

Etagヘッダの場合も同様の懸念があります。更に、オリジンサーバーを複数台用意する冗長構成だった場合、各オリジンサーバーでEtagヘッダの値が同一になるように設定する必要があります。同一でない場合、どのオリジンサーバーからコンテンツをレスポンスされたかによってCDNが受け取るEtagヘッダの値が異なるので、実際にはコンテンツが更新されていなかったとしても、コンテンツの再取得が行われてしまいます。結果的にキャッシュHIT率の低下に繋がるので注意が必要です。

3. Expires/Cache-Controlヘッダなどの影響

ExpiresヘッダやCache-Controlヘッダはブラウザやキャッシュサーバーに対してキャッシュのルールを指定するためのHTTPヘッダです。
J-Stream CDNext」では、オリジンサーバー側で設定されたCache-Controlヘッダも基本的に有効になり、これによってキャッシュ挙動を制御することが出来ます。この値によってキャッシュHIT率に影響を及ぼす場合があり、考慮が必要です。

Expiresヘッダ

Expiresヘッダはキャッシュの有効期限を表すHTTPレスポンスヘッダです。クライアントからのリクエストに対して、WebサーバーがExpiresヘッダを指定してレスポンスすることで、サーバー側から明示的にキャッシュを利用する期限(=クライアントがWebサーバーへのリクエストを行わない期限)を設定することが出来ます。クライアントは余計なリクエストをせず、Webサーバーは余計なリクエストを受けないようにすることが可能です。

「J-Stream CDNext」もExpiresヘッダの指定がある場合は、指定の期限内であればキャッシュコンテンツを利用しますので、CDNの効率的な利用に繋がります。ただしExpiresの期限が短い場合は逆にオリジンサーバーへの問い合わせ頻度が増してしまいますので注意が必要です。

Cache-Control:max-age

Cache-Control:max-ageもキャッシュの有効期限を指定するHTTPレスポンスヘッダです。Expiresヘッダは具体的な絶対時間によってキャッシュの有効期限を指定しますが、max-ageは「max-age=60」(60秒間キャッシュが有効)のように相対時間で指定をします。これが「max-age=0」になっていると、キャッシュの有効期限は0秒間ということになり、クライアントは毎回Webサーバーへリクエストを行わなければいけません。
「J-Stream CDNext」の場合も毎回オリジンサーバーへリクエストを行うため、キャッシュHIT率はマイナスに影響してしまいます。

 Cache-Control:no-cache/no-store

Cache-Control:no-cache/no-storeはどちらもクライアントにキャッシュの利用、あるいはキャッシュ行為そのものを制限させるHTTPレスポンスヘッダです。明示的にWebサーバーの管理者側でクライアントにコンテンツのキャッシュをさせたくない場合に利用されることが多いですが、利用するCMSの仕様によって意図せずこれらのヘッダが付与されてしまう場合があり、本来はキャッシュをさせたい時には注意が必要です。
「J-Stream CDNext」もこれらのヘッダがある場合はキャッシュをせず、毎回オリジンサーバーへリクエストを行いますので、キャッシュHIT率は下がります。

Cache-Controlヘッダを無視

Cache-Controlヘッダは意図して設定されたものであれば問題ありませんが、CDNを利用するにあたっては、配信効率を下げてしまう場合があります。

「J-Stream CDNext」には「Cache-Controlヘッダを無視してキャッシュ」する機能があり、これらのヘッダが存在していても、それを無視してCDN側で設定したキャッシュルールによってコンテンツをキャッシュし配信することが可能です。配信のルールをCDNによって制御したい場合は当機能が有効です。当然Cache-Controlヘッダによってキャッシュルールを制御したい場合には、無視をせず利用することも可能ですので、CDNを利用するWebサイトによって意図した通りの設定を行うことが重要です。

Cache-Controlヘッダ、Expiresヘッダ

この場合はExpiresヘッダが過去の日付になっているので常にキャッシュの有効期限が切れている状態を表します。ブラウザがExpiresヘッダをサポートしていない場合があるので、Cache-Control:max-age=0も指定されています。続いてLast-Modifiedヘッダによって実際にコンテンツの更新が行われているかオリジンサーバーへ確認をします。この指定により、必ずオリジンサーバーへ最新コンテンツの有無を確認しつつも、極力キャッシュを利用して配信するという動作になります。

4. Varyヘッダの影響

Varyヘッダの影響、Vary:User-Agent

Varyヘッダは設定されている値によってキャッシュを分ける必要があることを示すHTTPヘッダです。例えばPCとスマートフォンで、同じURLでも配信するコンテンツをサーバー側で出し分ける必要がある場合に、Webサーバーは「Vary:User-Agent」というHTTPレスポンスヘッダを付与することで、User-Agentの値によってレスポンスするコンテンツが異なることを示します。

このようなWebサイトにおいて、「J-Stream CDNext」では同じURLでもUser-Agentごとに異なるキャッシュコンテンツを保持し、User-Agentが一致するクライアントに対して専用のコンテンツを配信するように振舞います。
ただしUser-Agentは非常に多くの種類が存在し、CDNはその種類ごとにキャッシュコンテンツを取得します。内容が変わらない同一のコンテンツであっても、クライアントのUser-Agentに合致したコンテンツをCDNがキャッシュしていない場合には、CDNはオリジンサーバーへリクエストを行わなければなりません。その結果キャッシュHIT率は低下し、CDNを有効に利用できていない状態になってしまいます。

Varyキャッシュの正規化

「J-Stream CDNext」はVary:User-Agentが設定されているコンテンツの配信に際して、User-Agentを特定の文字列に一致するか否かでパターン化することができる「Varyキャッシュ正規化」機能を搭載しています。これにより、例えば「iPhone」に当てはまるUser-Agentを持つクライアントごとのキャッシュなど、ある程度User-Agentをパターン化することが出来るようになり、CDN側も最大でも設定されたパターンの数だけキャッシュを持てば良くなるため、キャッシュHIT率の向上が期待できます。
また当機能はVary:User-Agentが設定されていない場合でも、設定されたUser-Agentの文字列パターンごとにキャッシュを持つことが可能です。

5. クエリキャッシュの利用

「J-Stream CDNext」 は基本的にURLを元にコンテンツのキャッシュを行います。URLにクエリストリングが含まれる場合には、クエリストリングを含むURLによってコンテンツのキャッシュを行うことが可能です。Webサイトの内容にクエリストリングが影響する場合にはこの設定が有効です。
ただし、例えばリクエストごとにランダムの値を付与するような、Webサイトの内容に関わらないクエリストリングが存在する場合、その値ごとにキャッシュを保持すると、同一URLでもクエリストリングまで一致しているリクエストにしか有効でないキャッシュをCDNが持つことになってしまうので、キャッシュHIT率の低下に繋がります。

「J-Stream CDNext」では、特定のクエリkeyのみをキャッシュに利用、逆に特定のクエリkeyを除外するという設定が可能です。これにより必要なクエリストリングのみを利用し、キャッシュHIT率の低下に繋がるクエリストリングを無視してコンテンツのキャッシュを行うことが出来るので、キャッシュHIT率の低下を防ぐ効果が期待できます。

■ CDNext管理コンソールのクエリキャッシュ設定画面

以上、キャッシュHIT率の向上、または低下に影響する要素と、それに対応する「J-Stream CDNext」の機能についてご紹介しました。Jストリームでは経験豊富なエンジニアと詳細な設定が可能なCDNサービスによって、お客様のWebサイトに対して最適なサービスご利用方法をご提案します。お気軽にご相談ください。

J-Stream CDNext「料金と機能の一覧資料」をダウンロードする

サービス詳細

関連する記事一覧

Jストリームの
ソリューションに
興味をお持ちの方は
お気軽に
お問い合わせください。

登録無料!

Jストリームのサービスを活用した成功事例や、お客さまの課題解決につながるお役立ち情報などをメールでお届けしています。

メールマガジン登録