個人向けCDN「CloudFlare」を試してみた

今までの自宅サーバー高速化の取り組み

このブログはWordPressを自宅サーバー(自作パソコン)で構築・配信しているのですが、今まで様々な高速化への取り組みやパフォーマンスチューニングを行って来ました。代表的なものでも以下のような対策を講じてきました。

  • サーバーのハードウェアのスペックアップ
    自作パーツで、Core-i7 3770 HT8コア、メモリ32GB、SSD512GBで構成
  • PHPにAPC(アクセラレーター)を導入
    php.iniもメモリ関連やAPC関連の設定を最適化
  • ApacheをやめてNginx1.2の最新版でPHP-FPMのリバースプロキシを構成
    NginxからPHP-FPMへの接続をポート通信ではなくソケット通信に切り替え
  • Nginxのプロキシキャシュの範囲を強化
    キャッシュ対象を画像、JS、CSSにも適用。HTMLをGZIP圧縮してブラウザに送信
  • MySQL5.6の導入。PHP5.4の最新版の導入
  • MySQLのmy.cnfをメモリ32GBで最適化するようにチューニング
    innodb_buffer_pool_sizeなどをメモリ32GBに合わせて最適化
  • MySQLのクエリキャッシュの有効化
  • KVSのRedis2.6を導入
    WordPressとRedisを連携させKey Valueをメモリに展開
  • ファイルシステムをチューニング
    SSDに最適化するよう設定
  • Linux Kernel 3.7を導入
    OSはopenSUSE 12.3
  • ルーターにYAMAHA NVR500を導入
    マンションの関係でフレッツ光(理論値200Mbps)ですが、実行速度160Mbps以上、LAN内は860Mbps以上出ます
  • 固定IPプロバイダを契約
    DiX。月額980円

これらの対策により、パフォーマンスが向上し、 自宅のデスクトップパソコンから自宅サーバーのブログへLAN内でアクセスした場合、0.8秒で表示されました。トップページはかなりファイルサイズの大きな画像を4枚使ってスライドショーをさせていることを考えると、なかなかの速さです。さらに、個人で借りているさくらVPSサーバーから自宅サーバーにab(Apacheベンチマークツール)で計測してみたのですが、同時接続100で1000回リクエストを送ったところ、Requests per second(秒間あたりのリクエスト数)は180以上捌けました。

しかし、自宅以外のネットワークからインターネット越しにブログのトップページを表示すると、数秒間以上待たされます。このブログはスマートフォンやタブレット端末にも対応しているのですが、LTE接続でも読み込みにかなり待たされます。インターネットを経由すると、経路情報が多くなるので、伝送速度が低下して遅延が発生するのですが、この辺のボトルネックが何とかならないかと思っていました。

CDNという解決策

CDN(Contents Delivery Network)には早くから注目していました。CDNを使えば、実配信サーバーからコンテンツファイルをISP(プロバイダ)に近いキャッシュサーバーにまでデリバリーして高速化することができます。YahooやYouTubeなどもこのCDNを使ってコンテンツ配信を高速化しています。代表的なCDNサービスにAkamaiやLimelightがあります。

CDNの仕組みは大体こんな感じです。
zu01

しかし、CDNは非常に高価です。法人でなければ払い続けることが難しいくらいの金額がかかります。何とか個人向けの低価格のCDNサービスがないか探していたのですが、なかなか見つかりませんでした。AWSのCloudFlountなどは低価格のCDNだったのですが、対象がAmazonのEC2インスタンスなどに限られるため、自宅サーバー用途では使えません。ということで半ば諦めかけていました。

CloudFlare

しかし昨日、WordPressで読み込み速度1秒台を実現するために実施した5つの施策という記事を読んで、その中で紹介されていたCloudFlareというCDNサービスを発見しました。何と無料で利用できます(帯域制限あり)。帯域制限なしの有料版(Pro Plan)も月額$20で利用できます。これは試してみよう!と思って早速申し込んでみました。

CloudFlare申し込み手続きは簡単でした。まずメールアドレスとパスワードを入力してアカウントを作ります。次にWEBサイトのアドレスを登録します。そうすると、CloudFlareのネームサーバー情報が出てきます。管理画面からこのネームサーバーに対して、ドメインのDNSレコードを登録します。私の自宅は固定IPのプロバイダなので、Aレコードとして自宅のIPを入力しました。また、メールはGoogle Appsを使っているので、MXレコードはGoogle Appsのメールサーバーを指定しました。これで利用登録は完了です(パフォーマンスに関するオプション設定もあるのですが、当初はデフォルトにしました)。あとは、ドメインのレジストラ管理画面で、ネームサーバー情報をCloudFlareのネームサーバーに変えて、DNSの浸透を待つだけです。

驚異的な接続速度

最初は無料のCDNサービスなんて…と、半信半疑だったのですが、結果は驚くべきものでした。DNS浸透後、外部からブログのトップページにアクセスしてみたら、0.3秒で表示されました。もちろん、グローバル接続です。 下記がその証拠画像になります(幾つかの計測ツールを使ったのですが、わかりやすくするように、WEB担当者フォーラムのページ速度分析ツールのブックマークレットの結果を貼り付けます)。

 

7f3855164ddc91591131a435e07fc8d1

予想を超えた驚異的な速度です。何回か計測してみましたが、やはり0.3〜0.5秒以内に表示されます。スマートフォンやタブレットでのLTE通信での表示も試してみたのですが、以前よりも段違いに速くなっていました。インターネット経由の表示のボトルネック解消に成功しました!あまりに嬉しくて、帯域制限なしのPro版を申し込みましたw  クレジット決済ですぐにPro版に切り替わります。Pro版だとSSLやいくつかのパフォーマンスオプションも使えます。一部でSSLを使っていたので、Pro版にしてSSL接続も確認しました。

WEBは接続元によって解決されるグローバルIPアドレスが変わっていました。CNAMEで接続元に応じた最適なキャッシュサーバーのIPアドレスを返しているようですね。また、Google AppsのMXレコードもちゃんと正常に処理されて、ブログのドメインでメールをGoogle Apps内で受信することが出来ました。

CloudFlareの注意点

そんな感じでブログの高速化に成功したCloudFlareですが、いくつか注意点があります。まず、CloudFlareのドキュメントを見ると、データセンターは日本国内では東京1箇所のみのようです。データセンターの数は重要ではありませんが、各ISPに対して最適な拠点を持っているというレベルにまでは充分に至っていないのかなと思います。日本国内の利用者数もそんなに多そうに見えないですし。

試しに、さくらVPSから、CloudFlare上のブログのIPと、自宅サーバーのブログのIPにそれぞれPING(56バイト)を打ってみたのですが、自宅は4msくらいで応答が返るのに対して、CloudFlare上のIPアドレスの方は応答に100msほど掛かっていました。自宅からCloudFlare上のIPアドレスにPINGを打つと4msほどだったので、自宅からの接続は最適化されているようですが、さくらインターネットのデータセンターからは遅い、つまり接続元によっては自宅サーバーより遅延が発生する可能性があります。これは接続元に応じてIPアドレスが変わるのと経路が最適化されているかどうかに懸かってくるので、全体でどうかは運用してみて様子を見てまたレポートします。

また、CloudFlareは拡張子でキャッシュファイルを判定するので、WordPressで後ろに拡張子のバージョン情報がついたファイル名になっているとキャッシュされません。WordPressの wp-content/themes/テーマディレクトリ/functions.php に以下の記述を追加する必要があります。

これで静的ファイルのキャッシュが有効になります。

最後に

まだまだ日本では様子見の感があるCloudFlareですが、外部から0.3秒でトップページを表示できたことは事実なので、今後も他の色々なネットワークから接続してみて計測してみようと思います。多くのISPでキャッシュサーバーへのネットワークが最適化されていると良いのですが。信頼性が要求される企業向けというよりは、SOHOや個人向けCDNに分類されると思います。

駄目そうだったら、またリアルの自宅サーバーの配信に戻します。無料で試せるので、他のブロガーの皆さんも一度試されてみてはいかがでしょうか。特に海外展開を考えているブログなどは、無料または格安でCloudFlareの拠点が使えるので、日本の配信サーバーにダイレクトにアクセスされるよりは速くなる可能性が高いと思います。

とりあえず始まったCDN環境。しばらくしたら、またレポートします!

関連記事