【この記事の概要】
この記事を3行でまとめると、- CloudFlareでエッジサーバーがキャッシュしてくれるかどうかは、
- URLの末尾が「キャッシュ対象の拡張子」に見えるか否かで決まる
- (MIMEタイプは関係ない)
では、以下、本文です。
そもそもCloudFlareって?
CloudFlareは、無料でも転送量無制限で利用できるリバースプロキシ型サービスです。Webサイトを運営する上で、「転送量」はなかなか頭の痛い問題です。
安いレンタルサーバーだと、ちょっとアクセスが増えるとすぐアクセス量制限に引っかかって“503 Service Temporarily Unavailable”が表示されがち。
“Bandwidth: Unlimited”をうたう海外レンタルサーバーを頑張って英語で契約してみたら、「転送量は無制限だがセッション数の上限を超えた」という理由でアカウントをsuspendされて、凍結解除の交渉を英語でするハメに陥ったり……。
そんな中で、無料プランでも転送量制限のないCloudFlareは、実にありがたい存在です。
以前はエッジサーバーが日本国内になかったので「CloudFlareを使うとサイトが遅くなる」という問題もありましたが、今では日本にもエッジサーバーが設置されたようで、pingを打つと最速で5msなんて数字を叩き出したりします。
CloudFlareはどういう動作をするの?
CloudFlareはリバースプロキシとして動作します。つまり、対象WebサーバーへのすべてのアクセスはCloudFlareのエッジサーバーを経由します。
| ユーザー | →①→ ←④← | CloudFlare エッジ サーバー | →②→ ←③← | ウチの Web サーバー |
その際、特定のファイルをエッジサーバーにキャッシュしてもらうことができます。
キャッシュされたファイルは、アクセスがエッジサーバーで折り返すようになります。
| ユーザー | →①→ ←②← | CloudFlare エッジ サーバー | | ウチの Web サーバー |
CloudFlareがキャッシュするファイルとは?
CloudFlareがどんなファイルをキャッシュしてくれるのかと言うと、具体的にはFAQ(What file extensions does CloudFlare cache for static content?)に列挙されています。ざっくり説明すると、以下のような拡張子を持つファイルです。
- .css
- .js
- .jpg/gif/png/ico/svgなどの画像ファイル
- .pdf/csv/doc/ppt/xlsxなどのドキュメントファイル
- .swf
- .midi/mid
- .pls(プレイリストファイル)
逆に言うと、リストに含まれない次のようなファイルはキャッシュされません。
- .html/xhtml
- .cgi/php
- .xml
- .json
- .zip/bz2/rar
- .mp3/mp4/flv
- その他、リストに記述されていない拡張子のファイルすべて
(これらのファイルもキャッシュしてもらう方法もあるのですが、それは次回)
キャッシュ可否を決めるのはMIMEタイプ? 拡張子?
拡張子.jsはキャッシュされて、拡張子.cgiはキャッシュされない――となると気になるのが「JavaScriptを出力するCGI」はキャッシュされるのか、それともされないのか。そこで実験してみました。
用意したのは、下記のようなJSを出力するCGIファイル。
#!/usr/bin/ruby
puts "Content-type:application/javascript"
puts
puts "document.writeln('#{Time.now.to_s}');"これをCloudFlare経由で、以下のURLでアクセスしてキャッシュされるかどうか見てみました。
| js.cgi | ×キャッシュされない |
|---|---|
| js.cgi/pathinfo.js | ○キャッシュされる |
| js.cgi?query=.js | ○キャッシュされる |
MIMEタイプだけではダメで、PATH_INFOでもQUERY_STRINGでもいいからURLの末尾が対象拡張子で終わっている必要があるようです。
【確認内容】(レスポンスヘッダは一部省略)
キャッシュされる場合:
$ curl -i 'http://cloudflare.example.jp/js.cgi/pathinfo.js'
HTTP/1.1 200 OK
Server: cloudflare-nginx
Date: Mon, 04 Mar 2013 00:00:00 GMT
Content-Type: application/javascript
CF-Cache-Status: MISS
Expires: Mon, 04 Mar 2013 02:00:00 GMT
document.writeln('Mon Mar 04 09:00:00 +0900 2013');
※↑1回目のアクセス:まだキャッシュがなかった(この内容でキャッシュが作られる)
$ curl -i 'http://cloudflare.example.jp/js.cgi/pathinfo.js'
HTTP/1.1 200 OK
Server: cloudflare-nginx
Date: Mon, 04 Mar 2013 00:00:12 GMT
Content-Type: application/javascript
CF-Cache-Status: HIT
Expires: Mon, 04 Mar 2013 02:00:12 GMT
document.writeln('Mon Mar 04 09:00:00 +0900 2013');
※↑2回目のアクセス:キャッシュが使われている
キャッシュされない場合:
$ curl -i 'http://cloudflare.example.jp/js.cgi'
HTTP/1.1 200 OK
Server: cloudflare-nginx
Date: Mon, 04 Mar 2013 00:00:30 GMT
Content-Type: application/javascript
document.writeln('Mon Mar 04 09:00:30 +0900 2013');
※↑1回目のアクセス:CF-Cache-Statusヘッダがない
$ curl -i 'http://cloudflare.example.jp/js.cgi'
HTTP/1.1 200 OK
Server: cloudflare-nginx
Date: Mon, 04 Mar 2013 00:00:42 GMT
Content-Type: application/javascript
document.writeln('Mon Mar 04 09:00:42 +0900 2013');
※↑2回目のアクセスでもキャッシュされていないちなみに、CGIのレベルでExpiresレスポンスヘッダをわざわざ吐いても、結果は変わりませんでした。
クエリ文字列の末尾が拡張子っぽく見えること
「クエリ文字列が拡張子っぽい場合」の挙動をもう少し掘り下げてみます。| 1) js.cgi?1=query&2=.js | ○キャッシュされる |
|---|---|
| 2) js.cgi?1=.js&2=query | ×キャッシュされない |
| 3) js.cgi?1=query&2=js | ×キャッシュされない |
1)のように、URLの末尾がキャッシュ対象拡張子であれば、クエリが複数あってもキャッシュされます。
ただし、2)のように、クエリの順番を入れ替えるとキャッシュされなくなります。
3)は1)のクエリの「.js」を「js」に置き換えた(ピリオドを削った)ものですが、これもキャッシュされません。
どうやら「URLの末尾が拡張子に見える」という形式を必ず守らなければならないようです。
次回
⇒CloudFlareの3種類のキャッシュレベルの違いを調べたCloudFlareのキャッシュレベルは Basic / Simplified / Aggressive の3段階から選べますが、その違いについて調べます。
0 件のコメント:
コメントを投稿