CDNはWEBサイトにある画像などのコンテンツをキャッシュし、キャッシュしたコンテンツをユーザーに配信します。このCDNから配信した比率のことをHIT率というのですが、CDNを利用するからにはなるべく高いHIT率をたたき出したいと皆さん感じているはずです。
今回は、CDNでHIT率を向上させるための方法としていくつか代表的なチューニングをご紹介致します。
キャッシュキーについて
CDNサービスはブラウザーからアクセスがあると、そのアクセスした様々な情報をみてコンテンツがユニークかどうか判別しキャッシュを分ける作業をします。
その際、判別する情報のことを弊社では「キャッシュキー」と呼んでいます。
キャッシュキーとして一番始めに思い浮かぶのはおそらくURLだとおもいます。URLが異なれば基本違うコンテンツという理論に基づいてCDNがまず初めにみる値です。
※CDNは10年前からある技術で、当初インターネットが始まった頃はURLが分かれていれば内容も分かれているという、静的コンテンツがメインでした。
URL以外のキャッシュキー
ファイル名の後にクエリストリングが付与されることもありますが、このクエリストリングもキャッシュキーとなります。これに加え、ブラウザーから送信されるリクエストCookieやHTTPヘッダーの情報も代表的なキャッシュキーです。
さて、キャッシュキーとなる値が多ければ多いほど個別にキャッシュが生成されていくため、キャッシュHIT率は低下します。よって、まず高HIT率を出すためにはこのキャッシュキーをどのように取り扱うかが非常に重要となってくるため、今回はクエリストリングとCookieに関するチューニング例をご紹介します。
クエリストリングのチューニング
クエリストリングとは、WebブラウザなどがWebサーバに送信するデータをURLの末尾に特定の形式で表記したものです。URLの末尾に?マークをつけ、「名前=値」の形式で示します。サイト検索をした結果のページや、ブログなどのページネーション、またはGoogle AnalyticsのキャンペーンURLなどが代表的な利用例です。
クエリストリング付きURL
https://www.redbox.ne.jp/test.jpeg?type=images
クエリストリングは同一URLで異なる情報を出力する際や、ある識別子のように用いられることがありますが、画像やCSSなどの静的コンテンツでは情報の識別にのみ利用され出力される内容はクエリストリングの値に関係なく同一コンテンツであることがほとんどです。
静的コンテンツのクエリストリングを削除
CDNサービスは、クエリストリングを含めたキャッシュが可能で、デフォルト動作でクエリストリングごとキャッシュする場合が多いです。WordPressに代表されるCMSは、CSSやJSなどの静的コンテンツであってもバージョン情報のような識別子を付与するケースがあるため、まずは静的コンテンツのクエリストリングを削除するチューニングを検討しましょう。これにより、異なるクエリストリングが付与されていた場合でも、同じキャッシュとして認識するためキャッシュHIT率が上昇します。
クエリストリングを削除する意味
そもそも、クエリストリングが変更されない仕様であれば、わざわざ削除する意味はないかもしれません。これは、クエリが含まれているコンテンツと含まれていないコンテンツが混在する場合に限り、クエリを削除する意味があるためです。しかし、クエリストリングがついている場合はキャッシュせずオリジンサーバーにフォワードするCDNも存在する可能性があるため、不要なものは削除して綺麗にしておくというのがセオリーです。
クエリストリングを削除できない動的ページ
さきほどのように同一コンテンツでクエリストリングを削除できると分かっているコンテンツであれば、削除してしまうだけで簡単にチューニングができると思います。しかし、クエリストリングの値をみて動的に内容が変化するページなどは安易に削除してしまうとトラブルの原因となります。このようにクエリストリングを削除出来ないコンテンツであっても、実はCDN側の機能でHIT率を高めることが可能です。
複数パラメーター付与時の注意点
クエリストリングは複数の値を利用する際、 & 文字で区切られたパラメータを 1 つ以上含めることができます。
複数のパラメーター付きURL
https://www.redbox.ne.jp/cdn.html?cid=123&uid=123&user=000
https://www.redbox.ne.jp/cdn.html?user=000&uid=123&cid=123
https://www.redbox.ne.jp/cdn.html?uid=123&cid=123&user=000
こちらの例のように複数パラメータが付与されている場合、名前=値というブロックの順番が入れ替わってしまい、同じ内容のコンテンツを返却するにもかかわらずURLが別々と認識され、結果3つのキャッシュをCDNが作成してしまう場合があります。CDNフレンドリーなシステムにする場合は、極力このようなURLの生成をシステム側で避けることが重要です。しかし、WordPressに代表されるCMSやOSSでは、生成されるクエリの内容まで精査したりシステムの改修を行うことが難しい場合もあるとおもいます。
クエリストリングのソート(ボルトソート)
弊社エッジキャッシュCDNは、複数パラメータが付与されている場合、キャッシュを行う前にこれらの値をCDN側で以下のようにソート(ボルトソート)し、同一URLであるように認識させる工夫をしています。
複数パラメーターをソート前
https://www.redbox.ne.jp/cdn.html?cid=123&uid=123&user=000
https://www.redbox.ne.jp/cdn.html?user=000&uid=123&cid=123
https://www.redbox.ne.jp/cdn.html?uid=123&cid=123&user=000
複数パラメーターをソート後
https://www.redbox.ne.jp/cdn.html?uid=123&cid=123&user=000
これにより先ほどのように値が単純に入れ替わってしまっただけのURLも1つのキャッシュとして認識させることができ、キャッシュHIT率を高めることができます。
Cookieのチューニング
Cookieはアクセスしてくるユーザーを識別するために用いられる手法の一つで、「リクエストCookie」と「レスポンスCookie」の2種類が存在します。
このユーザーを識別するためのCookieも大抵のCDNは内容に応じてキャッシュを別々に生成するキャッシュキーとなるため、実はキャッシュHIT率を低下させる大きな原因の一つです。
リクエストCookieの取り扱い
WEBブラウザーは様々な情報をCookieに保存し、WEBサイトにアクセスする際Cookieを一緒に送信してきます。WEBサーバーやシステムはこれらのCookieの値をみて、たとえば何回訪問してくれたユーザーなのか、またはショッピングカートになにを入れたのかという情報を把握します。さらに、ほとんどの会員サイトの場合は認証情報をCookieに保存し、次回以降ID/パスワードを入力する必要がないように認証ユーザーかどうか識別することにも利用しています。
そのため、先ほどのクエリストリングのように安易に削除してしまうことは避ける必要があるのですが、静的コンテンツの場合はCookieの値に左右されないことが多いため、クエリストリングと同様に代表的な静的コンテンツのCookieを削除することを検討してみましょう。
WordPressのCookie例
WordPressなどのCMSは認証処理にCookieを利用するため、何も考えずCDN側でCookieをすべて削除してしまうと管理画面にログインができなくなります。最悪のケースでは認証されたページがキャッシュされてしまい、認証していないユーザーが管理画面を見てしまう場合も考えられます。よって、動的コンテンツのCookieの扱いはとてもシビアなのですが、ログインに必須であるCookieのみ残し、あとのCookieを切り捨てるような運用が必要です。
以下の条件に当てはまるCookie以外は削除
comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in
こちらはあくまで一例です。WordPressの場合はURLのパスをベースにCookieを削除する構成をお勧めしていますが、このように、どのようなCookieが何に利用されているか判断が可能であれば、必須Cookieだけを残しそれら以外のCookieは削除してしまうということも手段の一つです。
レスポンスCookieの取り扱い
レスポンスCookieとはサーバーもしくはプログラムから、Cookieの情報をブラウザやアプリに送信することを言います。
レスポンスCookie例
Set-Cookie: Name=value1; domain=ドメイン名;path=パス名; expires=有効期限; secure
CDNではレスポンスにCookieが含まれる場合は、セキュリティの観点からキャッシュしない動作となることがほとんどです。これは認証情報などセキュアな値を元にキャッシュを生成してしまうと大事故につながる恐れがあるためです。
弊社のキャッシュサーバーも、レスポンスにCookieが含まれている場合、キャッシュしない動作がデフォルトですが、コンテンツを熟知されているお客様の場合は、レスポンスCookieをキャッシュキーに含めてほしいとご連絡いただいたり、または、プログラム側をいじれないので特定の値のレスポンスCookieが付与されていた場合はCookieを削除してほしいというご要望もいただくことがありそのようなカスタマイズも柔軟に承っています。
レスポンスCookieのチューニングは、極力不要なCookieはプログラム側で出力しないよう工夫する対策が必要です。ヘッダをみても設定が正しいはずなのにキャッシュしない!!という場合大体レスポンスCookieが付与されていることが原因だったりします。このように、なんでもかんでもトラッキングするためにどんどんCookieを送信することは、CDNで負荷分散対策を行う上で致命的となります。
まとめ
今回は、クエリストリングとCookieを中心にCDNでキャッシュHIT率を高めるためのTIPSをいくつかご紹介しました。
CDNでHIT率というのは非常に重要で、CloudFrontやFastlyに代表される従量課金CDNは、CDNからオリジンサーバーに取得する際の転送量も課金対象となるため、HIT率が低いと料金も比例して上がります。※弊社のCDNや従量課金の一部CDNではオリジンサーバーからコンテンツを取得する際の転送量が無料というサービスもあります。
URLベースのキャッシュキーの他に、Cookieなどの値も含めたキャッシュとなると、同一コンテンツにも関わらず不必要に複数キャッシュが生成されてしまい、結果としてHIT率が大幅に低下してしまいます。そのため、不要なものは削除する、削除できない必要なものは正規化するといったチューニングがCDNで高いHIT率を叩き出すために押えておくポイントです。CDNを既に導入している方は是非この機会に一度見直してみてはどうでしょうか。また、これからCDNの導入を検討している方は、このようなHIT率向上の考え方もあるのだということを認識して頂くだけでも運用がぐっと楽になります。