こんにちは。R&D室の佐藤博之です。
今回のエンジニアブログでは、IDCフロンティアのコンテンツキャッシュサービスを使ってコンテンツを配信する方法を紹介します。今回の構成では、オリジンサーバーにはIDCフロンティアのオブジェクトストレージサービスを使います。オブジェクトストレージサービスを使うことで、わざわざWebサーバーを構築することなく、簡単&安価に構成することが可能です。 このようにIDCFクラウドのロゴが表示されます。
IDCフロンティアのコンテンツキャッシュサービスについて
IDCフロンティアは2014年12月にコンテンツキャッシュサービスをリリースしました。世の中でいう、CDNサービスになります。コンテンツキャッシュサービスを利用することで、コンテンツを高速かつ安定的に配信できるほかに、オリジンサーバーの負荷軽減や突発的なアクセス増に対応できるようになります。
詳しいサービスの紹介についてはこちらをご参照ください。
構成
今回の構成は以下の通りです。オブジェクトストレージのバケット「idcfcache001」に保存したコンテンツ「idcfcloud.png」を、コンテンツキャッシュサービス内のキャッシュサーバーにキャッシュさせて配信します。エンドユーザーからアクセスするFQDNは「idcfcache001.cdn.jp.idcfcloud.com」とします。
実際にお客さまが利用する際は、バケット名、コンテンツ名、FQDNのすべてをお客さま側で決めていただきます。
手順
以下の手順で、オブジェクトストレージをオリジンサーバーにし、キャッシュサーバーからコンテンツを配信します。
-
IDCFクラウドでのアカウント作成
-
IDCFクラウド コンソールからオブジェクトストレージ用APIキーの生成
-
s3cmdのインストールおよびバケット作成
-
オブジェクトストレージへのコンテンツアップロード(Cache-Controlヘッダー投入)
-
コンテンツの公開設定
-
DNSサーバーでCNAMEの設定
-
外部からのコンテンツアクセス
-
Viaヘッダーの確認(キャッシュサーバーからレスポンスを返しているかの確認)
1. IDCFクラウドでのアカウント作成
今回の構成では、オリジンサーバーとしてIDCフロンティアのオブジェクトストレージサービスを利用します。オブジェクトストレージサービスはログやアーカイブ保管の他に、HTTP/HTTPSでのコンテンツ(画像、動画等)配信用途でも使うことができます。
IDCフロンティアのオブジェクトストレージサービスの紹介についてはこちらをご参照ください。
オブジェクトストレージを使うためには、IDCFクラウドのアカウントが必要になります。まずはIDCFクラウドにアカウントを作成します。
IDCFクラウドのアカウント作成方法は「めちゃ楽ガイド」をご参照ください。
2. IDCFクラウド コンソールからオブジェクトストレージ用APIキーの生成
作成したアカウントでIDCFクラウド コンソールにログインします。
画面上記の「東日本リージョン」から「オブジェクトストレージ」を選択します。
オブジェクトストレージのコンソールで「APIユーザー追加」を選択します。
リージョンで「EAST」を選択、APIユーザー名にメールアドレスを入力します。
APIキーが表示されます。
APIキーは後からでも確認可能です。APIユーザー名のリンクを選択すると、APIキーが表示されます。
3. s3cmdのインストールおよびバケット作成
続いてs3cmdのインストールとバケット作成です。s3cmdのインストール方法およびバケット作成方法は弊社でドキュメントを用意しております。こちらをご参照ください。
4. オブジェクトストレージへのコンテンツアップロード(Cache-Controlヘッダー投入)
s3cmdを使って、キャッシュサーバーにキャッシュさせたいコンテンツをオブジェクトストレージに保存します。その際、コンテンツにCache-Controlヘッダーを付与しておきます。Cache-Contorlヘッダーには、キャッシュサーバーに保存したい秒数を記述します。
以下の例では、idcfcloud.pngをキャッシュサーバーに600秒間キャッシュする形で、オブジェクトストレージへ保存しています。
ユーザーからコンテンツにアクセスされたタイミングで、キャッシュサーバー上のコンテンツがCache-Controlで設定されたキャッシュ時間を超過していた場合は、再度、オリジンサーバーへコンテンツを取得しにいきます。その際、コンテンツに変更があれば、キャッシュサーバー上のコンテンツを更新して配信します。コンテンツに変更がない場合は、キャッシュサーバー上のコンテンツをそのまま配信します。
# s3cmd --add-header=Cache-Control:public,max-age=600 put idcfcloud.png s3://idcfcache001/idcfcloud.png
5. コンテンツの公開設定
次にオブジェクトストレージに保存したコンテンツを外部公開します。オブジェクトストレージに保存したコンテンツはデフォルトではAPIキーをもったユーザーのみアクセス可能な状態になっています。
外部公開するために以下のコマンドを実行します。
# s3cmd setacl --acl-public s3://idcfcache001/idcfcloud.png
これで、バケット「idcfcache001」に保存したコンテンツ「idcfcloud.png」が外部公開されました。
Cache-Controlヘッダーが付与された状態で外部公開されているかを確認します。
オブジェクトストレージに保存したコンテンツは、
http://バケット名.ds.jp-east.idcfcloud.com/コンテンツ名
でアクセスすることができます。
curlコマンドを使いアクセスします。
# curl --head http://idcfcache001.ds.jp-east.idcfcloud.com/idcfcloud.png
HTTP/1.1 200 OK
Server: Riak CS
Last-Modified: Wed, 03 Dec 2014 12:23:06 GMT
ETag: "62dbc8827ca2018ca20c3278af861f71"
Date: Wed, 03 Dec 2014 12:25:33 GMT
Content-Type: image/jpeg
Content-Length: 17258
Content-Encoding: UTF-8
Cache-Control: public,max-age=600
上記の通り、Cache-Controlが付与された形のHTTPヘッダーが返ってくる状態であれば問題ありません。この状態はオブジェクトストレージが直接レスポンスを返しており、まだキャッシュサーバー側は使われていません。
6. DNSサーバーでCNAMEの設定
DNSのCNAMEを使って、キャッシュサーバー経由でレスポンスが返るようにします。DNSで以下のようにCNAMEを設定し、コンテンツキャッシュサービスにリクエストが送信されるようにします。
idcfcache001.cdn.jp.idcfcloud.com. CNAME cdn001.idcfcloud.com.
この設定後にidcfcache001.cdn.jp.idcfcloud.comにアクセスすると、キャッシュサーバー経由でレスポンスが返信されるようになります。
http://idcfcache001.cdn.jp.idcfcloud.com/
へのリクエストがオリジンサーバー(今回は、http://idcfcache001.ds.jp-east.idcfcloud.com/)
に送信される設定は、キャッシュサーバー側で行います。
※キャッシュサーバー側の作業は、IDCフロンティアのコンテンツキャッシュサービスに申し込みが完了次第、IDCF側で行います。IDCフロンティのコンテンツキャッシュサービスの申し込みはこちらから可能です。
7. 外部からのコンテンツアクセス
それではブラウザからアクセスしてみましょう。ブラウザはGoogle Chromeを使います。(HTTPヘッダーを確認できるブラウザであれば何でも構いません。)
HTTPヘッダーを確認するために、デベロッパーツールを利用します。デベロッパーツールはChromeの設定から「その他のツール」-「デベロッパーツール」で有効になります。
http://idcfcache001.cdn.jp.idcfcloud.com/idcfcloud.png
へアクセスしてみましょう。
このようにIDCFクラウドのロゴが表示されます。
1回目のアクセスでは、キャッシュサーバーにidcfcloud.pngが存在しないため、キャッシュサーバーからオブジェクトストレージへidcfcloud.pngを取得しにいきます。その後、キャッシュサーバーは取得したコンテンツをユーザーへ返すと同時にキャッシュサーバー上のディスクにコンテンツをキャッシュします。
キャッシュの状態は取得したコンテンツのViaヘッダーに記載があります。有効にしたChromeのデベロッパーツールからヘッダー情報参照してみてください。
HTTPヘッダーの最後の行にViaヘッダーが追加されています。[cMsSfW]がキャッシュの状態を表しています。今回は初回のアクセスのため、キャッシュサーバー側でキャッシュが存在しなかったことを表しています。
何度か更新してみましょう。以下のように、[cHs f ]の状態になると、キャッシュサーバーからキャッシュされたコンテンツが返されます。このときは、オリジンサーバーへのリクエストは発生しません。
パフォーマンス比較
最後に、キャッシュサーバーから配信した場合とオリジンサーバーから配信した場合で性能を比較してみましょう。ベンチマークツールにはhttp_loadを使います。並列度を10にして、60秒間計測した結果が以下の通りです。
オリジンサーバーからの配信に比べ、キャッシュサーバーからの配信が10倍以上早くなることが確認できます。IDCフロンティアのコンテンツキャッシュサービス内のキャッシュサーバーは、コンテンツ配信に特化したハードウェア構成、設定チューニングが行われており高速配信を実現しています。
最後に
今回はオリジンサーバーにオブジェクトストレージを利用しましたが、オリジンサーバーはIDCFクラウド上に構築した仮想マシンやデータセンター内の物理サーバーでも構いません。
コンテンツキャッシュサービス&オブジェクトストレージを使って配信している画像は、以下で公開しています。
http://idcfcache001.cdn.jp.idcfcloud.com/idcfcloud.png
是非、IDCフロンティアのコンテンツキャッシュサービスを活用して、コンテンツの高速配信を実現してください!