本文へジャンプします。

オブジェクトストレージを使って爆速自作CDN作ってみた

こんにちは。ニフティクラウド ストレージサービスチームの吉田です。

ニフティクラウドは、東日本/西日本/北米から選択できるマルチリージョン対応となっています。
今回は、複数のリージョンとオブジェクトストレージを活用して簡単に自作できるキャッシュサーバーの構築方法をご紹介させていただきます。また、キャッシュサーバーを複数のリージョンに構築して簡単なCDNを作成することもできますので、その方法もあわせてご紹介いたします。

なお、ニフティクラウドでは「fastly」という低価格で高機能なCDNサービスの提供も行っていますので、本格的にCDNを導入したい方はCDN(Fastly)をぜひご利用ください。

CDN(コンテンツ・デリバリー・ネットワーク)とは?

CDN(コンテンツ・デリバリー・ネットワーク)とは、Web上の動画や画像などのコンテンツを配信するのに最適化されたネットワークのことです。このWeb上の動画や画像などのコンテンツを分散配置したキャッシュサーバーの中から、ユーザーに最も近い経路にあるサーバーがオリジンサーバーに代わってコンテンツを配信するという仕組みです。
CDNを導入することで、コンテンツのキャッシュによってオリジンサーバーの負荷を軽減し、配信を高速化することができます。また、経由するルーターが少ないキャッシュサーバーから応答するため、遅延時間が少なくなり、より早くコンテンツを返すことが可能となります。

自作キャッシュサーバー、CDNについて

自作キャッシュサーバー、CDNの構築について簡単に説明します。
配信するコンテンツは、ニフティクラウドのオブジェクトストレージ上に配置します。そのコンテンツをキャッシュできるようにニフティクラウドでサーバーを作成し、キャッシュサーバーを構築します。
そして、ニフティクラウドの各リージョン(今回はeast-1~3,west-1,us-east-1)へ同様にキャッシュサーバーを構築します。
最後にドメインを取得し、同じホスト名でアクセスしたときに、ユーザーに近いキャッシュサーバーから応答をするようにすることでCDNを構築します。

今回、使用する環境の情報は以下の通りとなります。

構築リージョン OS ミドルウェア ベンチマークツール
east-1,east-2,east-3,west-1,us-east-1 CentOS7.1 64bit Plain Varnish 4.1 Apache Bench

cdn

1.コンテンツの配置

まずはニフティクラウドのオブジェクトストレージ上に、配信したいコンテンツをアップロードします。今回は以下の画像を使用します。

ttl_top_niftycloud01

オブジェクトストレージへのアップロード

オブジェクトストレージへのアップロードは、コントロールパネルから簡単に行うことができます。
まずはコントロールパネルからバケットを作成します。公開レベルはprivateのままで大丈夫です。

createbucket

作成したバケットの中に先ほどの画像をアップロードします。アップロードしたオブジェクトは後ほどキャッシュサーバーからアクセスするため、今回は簡単に公開レベルをpublic-readに設定します。

uploadfile

これでファイルのアップロードが完了しました。
アップロードしたファイルのURLの取得も簡単に行うことができます。

url-obj

2.キャッシュサーバー作成

続いてキャッシュサーバーを作成します。

まずは、ニフティクラウドのコントロールパネルからサーバーを作成します。今回はeast-2CentOS7.1 64bit Plainでサーバーを作成いたします。
サーバー作成方法については、以下のページをご確認ください。

ニフティクラウドは本当に5分以内でサーバー作成できるのか?【動画あり】

Varnish

今回は、Varnishでキャッシュサーバーを構築します。Varnishはリバースプロキシを提供するためのミドルウェアで、ウェブコンテンツのキャッシュ機能を備えており、簡単に設定することができます。
まずは、Varnishをインストールします。なお、インストールについては、自己責任でお願いいたします。
参考:Installation on Red Hat Linux

yum install epel-release
rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.1.el7.rpm
yum install varnish

続いて転送先ホストの設定をします。
先ほどの画像のURLのjp-east-2.os.cloud.nifty.comの部分を転送先に指定します。ポート番号は、今回は簡単にするために80番に設定します。
vim /etc/varnish/default.vcl

backend default {
    .host = "jp-east-2.os.cloud.nifty.com";
    .port = "80";
}

Varnishの待ち受けポートを80番に変更します。
vim /etc/varnish/varnish.params

VARNISH_LISTEN_PORT=80

それでは、Varnishを起動してみましょう。

systemctl start varnish

systemctl status varnish

起動ができたら、実際にアクセスして画像が表示されるか確かめて見ましょう。 ブラウザで
http://サーバーのIPアドレス/バケット名/オブジェクト名
を入力し、先ほどの画像が表示されれば成功です!

varnish-check
ついでに、Varnishの自動起動設定をしておくと、後ほど紹介するサーバーのイメージ化をするときに便利です。

systemctl enable varnish

3.Varnish ベンチマーク

では、キャッシュサーバーでコンテンツをキャッシュすると、実際にどれだけ応答が速くなるのかベンチマークを取ってみたいと思います。
また、北米リージョン(us-east-1)にも、先ほどeast-2に構築したキャッシュサーバーと同じものを構築し、北米リージョンからの応答の速さも見てみたいと思います。

比較対象は、オブジェクトストレージへ直接アクセスした場合、east-2のキャッシュサーバー、us-east-1のキャッシュサーバーで行います。
ベンチマークツールは、Apache Benchを使用し、east-2にアクセス用のサーバーを構築してベンチマークを取りたいと思います。
今回は、総アクセス数を40000、同時接続数を200に設定します。

まずは、オブジェクトストレージの方に直接リクエストした場合のベンチマークを取ります。

ab -n 40000 -c 200 https://バケット名.jp-east-2.os.cloud.nifty.com/オブジェクト名

結果は以下の通りとなります。

obj%e7%9b%b4%e6%8e%a5-n40000c200

続いてeast-2のVarnishを導入したキャッシュサーバーを経由して画像を取得するリクエストのベンチマークを取ります。

ab -n 40000 -c 200 http://east-2サーバーのIPアドレス/バケット名/オブジェクト名

結果は以下の通りとなります。

varnish-n40000c200

最後にus-east-1のVarnishを導入したキャッシュサーバーを経由して画像を取得するリクエストのベンチマークを取ります。

ab -n 40000 -c 200 http://us-east-1サーバーのIPアドレス/バケット名/オブジェクト名

結果は以下の通りとなります。

us-east-1-ab

直接アクセスした場合 Varnish Cache
east-2
Varnish Cache
us-east-1
1秒間あたりの処理リクエスト数[#/sec] 778.78 1556.15 236.98
1リクエストあたりの処理時間[ms] 1.284 0.643 4.220

reqpersec
ms

オブジェクトストレージに直接アクセスした場合とeast-2のキャッシュサーバーの結果を見ると、しっかりとキャッシュサーバーとしての役割を果たしているようです。
やはりVarnishを導入してキャッシュした方がリクエスト処理速度が早いですね。

しかし、北米リージョン(us-east-1)のキャッシュサーバーは流石に遅いようです。
当然ですがコンテンツをキャッシュしてもネットワーク的に遠すぎてはキャッシュサーバー導入による高速化は期待できません…
キャッシュサーバーによる高速化を図るなら、アクセス元に近いサーバーからコンテンツを配信したいですね。

4.各リージョンにキャッシュサーバー構築

ここからは自作CDNに入っていきたいと思います。
ニフティクラウドは、東日本、西日本、北米の複数リージョンがあります。その各リージョンにキャッシュサーバーを構築します。
今回は、east-1~3、west-1、us-east-1にそれぞれキャッシュサーバーを構築したいと思います。先ほど、Varnishを導入したキャッシュサーバーはeast-2に構築しましたので、そのサーバーのイメージを作成し、イメージからほかのリージョンにキャッシュサーバーを構築したいと思います。

サーバーイメージ作成

まずは、先ほど作成したサーバーを停止します(完全に停止するまで少々時間がかかります)。
サーバーが完全に停止したら、選択したサーバーの操作から、「イメージとして保存」を選択します。
すると、以下の画面になりますのでイメージ名と保存先リージョンを決定し、イメージを作成してください(イメージの作成には少々時間がかかります)。

serverimagecap

イメージからサーバー作成

イメージの作成が完了したら、そのイメージから別リージョンにサーバーを作成します。
まずはeast-1でイメージからサーバーを作成したいと思います。通常のサーバー作成と同様に、「サーバー作成」を選択してください。
次に、OSイメージ選択画面で、イメージ種別の「自分のイメージ」を選択してください。

serverimagecap3

すると、先ほど作成したイメージが表示されますので選択し、あとは通常通りサーバーを作成してください。
これでeast-1にvarnish導入済みのキャッシュサーバーが構築されました。上記のVarnish導入時に自動起動設定をしておけば、Varnishの手動起動や設定などはせずにキャッシュサーバーとして稼動します。
同様にeast-3、west-1、us-east-1にもイメージからサーバーを作成してください。

5.ドメイン取得

ドメインの取得もニフティクラウドのコントロールパネルから簡単にできます。
取得したいドメインを入力し検索すると、取得可能なドメインが表示されます。利用規約を確認し、Whois情報登録をすれば簡単に取得できます。

getdomainname

6.DNS設定

最後にユーザーに近いリージョンのサーバーからコンテンツを配信するために、DNSを使用します。
ニフティクラウドDNSでは、LBR(レイテンシーベースルーティング)という、1つのホスト名に複数のIPアドレスが紐付けられている場合、アクセス元の最寄りのサーバーに接続させることができる機能があります。
これで上記ベンチマークの北米リージョンのように、キャッシュサーバーによる高速化を図れないという残念な事態を回避できます。

ゾーン登録

取得したドメインをDNSのゾーンに登録します。
「DNSゾーン登録」を選択し、取得したドメインを登録してください。

dnszone

レコード登録

ゾーン登録が完了したら「レコード新規作成」を選択し、DNSのAレコードへ、レコード名および各リージョンに作成したキャッシュサーバーのIPアドレスを登録します。
この時、レコード名は日本国内のリージョン(east-1~3、west-1)は同じ値を、北米リージョン(us-east-1)は別の値を入力してください。

record
dnsarecord

LBR(レイテンシーベースルーティング)

続いて、北米からのアクセスは北米のキャッシュサーバーから、国内からのアクセスは国内のキャッシュサーバーから応答をするようにニフティクラウドのLBR(レイテンシーベースルーティング)機能を使用して実現します。
コントロールパネルから「レコード新規作成」を選択し、タイプのプルダウンから「LBR」を選択してください。
ここで入力したレコード名でアクセスすることで、ユーザーに近いサーバーから応答することができます。
値には、指定エリア以外からアクセスがあった場合にアクセスさせるレコード名を選択してください。
「追加」ボタンを押すと、エリアとアクセスさせるレコード名を選択できます。日本と北米でそれぞれ先ほど登録したレコード名を選択してください。
また、日本で選択するレコード名は1つにしてください。

lbr

では、実際にアクセスしてみたいと思います。わかりやすいように、北米リージョン(us-east-1)にアクセス用のサーバーを構築し、北米リージョンのキャッシュサーバーから応答が返ってくるかを見てみたいと思います。

us-east-1-access

接続しているサーバーのIPアドレスが北米リージョンのサーバーのIPアドレスになっていますので、アクセス元に近いサーバーに接続できていることがわかりました。

CDN完成

これで、「ニフティクラウドを活用した簡単自作CDN」が完成しました!
最後にブラウザでアクセスしてみます。

cdncheck

このように、ニフティクラウドとオブジェクトストレージを活用すれば、簡単に自作CDNを構築することができます。CDNを検討中だけど本格的なCDNの前にCDNを体感したいという方、またCDNに興味のある方、ぜひお試しください。

ニフティクラウド 導入相談窓口
ニフティクラウド 無料セミナー

閉じる

閉じる

クラウドブログ編集部

クラウドブログ編集部

ニフティクラウド ユーザーブログ編集部のアカウントです。 編集部からのお知らせや、レギュラーライター以外のゲストによる寄稿記事を掲載していきます。

浜中 慶

浜中 慶

1980年、神奈川県生まれ。2003年ニフティ入社。 ポータルサイト開発を中心に、音楽配信サービス、CGMサービスなど様々なプロジェクトに企画/デザイン/システム担当として参加。現在は@niftyのポータルサービス向けコンテンツ管理システムの企画/開発/運用を担当。

吉田 雄哉

吉田 雄哉

株式会社co-meetingの創業メンバー。「取締役&External- facing Technologist」と名乗り新しいIT技術を広く伝える活動とWebアプリケーション開発を行う毎日。パッケージベンダーでのSaaS立上げ・製造業の情報システム部門で企画やPM・受託開発と従事してきたため、ベンダーサイドとユーザサイド の両方の視点を持ち合わせる。

石田 健亮

石田 健亮

株式会社ドリーム・アーツで小売事業者向けSaaS「Shopらん」を企画、開発。メインの仕事はプログラマーだがサーバー管理や営業もこなすユーティリティプレイヤー。最近好きな事はパフォーマンスチューニング。特に並列化プログラミングがマイブーム。キライなことはデータセンターでの作業。騒音と乾燥が弱点。ニフティクラウドでデータセンターに行く必要が無くなったことが本当の利点だ と思っている。

五月女 雄一

五月女 雄一

ニフティでは「インフラを守る簡単な様で奥が深いお仕事」をしています。 夢はインフラの気持ちが読めるエンジニアになること。

わたなべ かずひろ

わたなべ かずひろ

専門学校卒業後、ソフトウェア開発会社で電力系統制御システムの開発に従事。その後、CD-ROM等マルチメディア系PCソフトの開発を経て、1998年フリーランスに。 2000年8月に株式会社イーツーの設立に参画。携帯を含む様々なWeb系のシステム開発に携わる。現在はiPhone/Androidアプリなどの開発も手がけている。

市角

市角

ニフティクラウドのコントロールパネル設計・開発をメインに、たまにインフラの運用やお手伝いもやっていたりします。コントロールパネルや新機能の活用方法、アイデアなどを中心に書いていく予定です。

仲山 昌宏

仲山 昌宏

歌って踊れるインフラエンジニア兼、PHPもRubyもJavaも書くPerl使い。 物理サーバの運用に飽きて、フルラックに格安サーバ詰めて自宅プライベートクラウドを構築中。 今年は個人的には分散処理を攻めていきます。

猪飼 賢広

猪飼 賢広

1984年、愛知県名古屋市生まれ。大学は福島県にある某大学。2008年ニフティに入社。 開発系部署に配属後、主に各種テーマサイト開発のシステム面調整、開発進行管理役などとして参加。 現在もPC・ガラケーサイトの開発まわりを担当。インフラまわりを触る案件にも携わっており、日々修行中。 好きな芸人はなかやまきんに君とレイザーラモンRG。

久江 裕之

久江 裕之

ニフティクラウドのインフラ運用、OS提供の仕事をしています。 新しいOSやイメージが出る時にこのブログでご紹介いたします。入社5年目。一流のインフラエンジニアを目指して日々勉強中。

竹内 豪

竹内 豪

ニフティクラウド エンジニア

山口

山口

ニフティクラウドの基盤設計、新サービス/アライアンス/インフラ企画、その他雑用全般を担当しています。 クラウドに欲しい機能や、こんなふうに使ってほしいという想いが共有できれば良いですね。

芳中 隆幸

芳中 隆幸

ニフティクラウドの開発、運用を担当しています。

酒井 浩平

酒井 浩平

ニフティクラウドの中にいます。 ネットワークまわりの運用・開発や自動化などに取り組んでいます。 すべてのエンジニアを幸せにすることを目指しています。

higebu

higebu

ニフティクラウド IaaSのエンジニアです。 ネットワーク、DRサービス with VMware vCloud® Air™ Technology辺りの担当をしています。

武田

武田

ニフティクラウドの開発・運用を担当しています。 各種機能の内容についてなどで執筆させていただく予定です。

福澤真

福澤真

ニフティクラウドのコンパネ開発、運用をしています。

森藤 大地

森藤 大地

データに関する仕事が好きです。

宮原徹

宮原徹

日本仮想化技術株式会社 代表取締役社長兼CEO。仮想化技術に関するコンサルタントとして長年活動しており、特にベンチマークテストによる性能評価を得意としている。

荒谷翔

荒谷翔

株式会社はてなでMackerelのセールスデベロッパーとして勤務しています

東條 望

東條 望

2014年にニフティへ中途入社。 入社後から現在まで、ニフティクラウドのサービス企画・開発を担当しています。 各サービスの紹介を執筆させていただく予定です。

世良迪夫

世良迪夫

ニフティクラウドのRDBなどを担当しています