#はじめに
ShinobiLayer: SoftLayerでCNAMEを使ってCDNアクセスする(設定編)
http://qiita.com/testnin2/items/af9848517477b3c45a4e
の解説編(?)です。設定編の記事を書く際によく分からなかったCDNの動作原理について、色々調査・検証した結果をまとめた感じの内容になります。
#設定編におけるまとめと疑問点
前回は以下のように設定することで、
以下の4つのURLにアクセスできるようになりました。
a) http://origin.mysl01.com/cdn/images/ninja.png
b) http://xxxxx.http.cdn.softlayer.net/80xxxxx/origin.mysl01.com/cdn/images/ninja.png
c) http://wpc.xxxxx.edgecastcdn.net/80xxxxx/origin.mysl01.com/cdn/images/ninja.png
d) http://cdn.mysl01.com/images/ninja.png
cdn.mysl01.comのCNAMEとしてwpc.xxxxx.edgecastcdn.netを設定しているのであれば、
e) http://wpc.xxxxx.edgecastcdn.net/images/ninja.png
でもアクセスできそうに思えるが、このURLではアクセスできません。何故でしょうか?
EdgeCast CDNの裏側
以下のようにCustomer Portalで設定した場合は、EdgeCast側でも幾つか設定が追加されているようです。
-
Originサーバー(origin.mysl01.com)のキャッシュデータは、EdgeCast ServerのDocument Root配下の**/80xxxxx/origin.mysl01.com/**に配置される。よって、今回のケースだと、http://wpc.xxxxx.edgecastcdn.net /80xxxxx/origin.mysl01.com でアクセスできるようになる。
-
HTTPリクエストのHostヘッダにcdn.mysl01.com(Edge CNAME) が入っていた時のみ、Origin Base URLで設定したDirectory配下(今回のケースだと**/80xxxxx/origin.mysl01.com/cdn**)からの相対パスになる。
つまり、
- http://origin.mysl01.com + /cdn/images/ninja.png
というOrigin Serverのキャッシュデータは、EdgeCastに配置された場合
- http://wpc.xxxxx.edgecastcdn.net + /80xxxxx/origin.mysl01.com + /cdn/images/ninja.png (HTTPリクエストのHostヘッダがcdn.mysl01.comではない時)
-
http://wpc.xxxxx.edgecastcdn.net +
/80xxxxx/origin.mysl01.com/cdn+ /images/ninja.png (HTTPリクエストのHostヘッダがcdn.mysl01.comで、Origin Base URLがhttp://origin.mysl01.com/cdn と設定されている時)
という風にアクセスできるということです。この挙動は、Apacheになじみのある方であれば、以下のようなVirtual Hostの設定みたいなものがSoftLayerのControl Panelで設定した際にEdgeCast CDNで構成されると考えると分かりやすいと思います(EdgeCastはApacheで動いていないと思いますし、実際にどういう実装をしているのかは知らないので、あくまでイメージだと考えてください)。
****<Cacheされる場所>****
/www/docs/80xxxxx/origin.mysl01.com/cdn/images/ninja.png
****<httpd.conf>****
#通常時アクセスはこのディレクトリがベース
DocumentRoot /www/docs
#HTTPリクエストのHostヘッダがcdn.mysl01.comの時は以下を利用する。
<VirtualHost *:80>
ServerName cdn.mysl01.com
DocumentRoot /www/docs/80xxxxx/origin.mysl01.com/cdn
</VirtualHost>
Hostヘッダを変更して色々試してみる
以下はHTTPリクエストのHostヘッダが、リクエストURLのホスト名と同じになるのでOrigin Base URLで設定した相対パスは使われずにNot Foundになります。絶対パスでのアクセスが必要です。
# curl -I http://wpc.xxxxx.edgecastcdn.net/images/ninja.png
HTTP/1.1 404 Not Found
Content-Type: text/html
Date: Sun, 22 Feb 2015 00:19:34 GMT
Server: ECAcc (sin/ECF4)
Content-Length: 345
# curl -I http://wpc.xxxxx.edgecastcdn.net/80xxxxx/origin.mysl01.com/cdn/images/ninja.png
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: image/png
Date: Sun, 22 Feb 2015 08:42:59 GMT
Etag: "11214d-52cb-50f5a3ee19e00"
Last-Modified: Wed, 18 Feb 2015 10:26:00 GMT
Server: ECAcc (sin/EC3E)
X-Cache: HIT
Content-Length: 21195
# curl -I http://xxxxx.http.cdn.softlayer.net/images/ninja.png
HTTP/1.1 404 Not Found
Content-Type: text/html
Date: Sun, 22 Feb 2015 00:18:39 GMT
Server: ECAcc (sin/ECF4)
Content-Length: 345
# curl -I http://xxxxx.http.cdn.softlayer.net/80xxxxx/origin.mysl01.com/cdn/images/ninja.png
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: image/png
Date: Sun, 22 Feb 2015 08:43:49 GMT
Etag: "11214d-52cb-50f5a3ee19e00"
Last-Modified: Wed, 18 Feb 2015 10:26:00 GMT
Server: ECAcc (sin/EC3E)
X-Cache: HIT
Content-Length: 21195
以下はHTTPリクエストのHostヘッダとして明示的にcdn.mysl01.comを指定したケースです。こちらはうまくOrigin Base URLからの相対パスを使ってアクセスされます。
# curl -I -H "Host: cdn.mysl01.com" http://wpc.xxxxx.edgecastcdn.net/images/ninja.png
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: image/png
Date: Sat, 21 Feb 2015 09:42:46 GMT
Etag: "11214d-52cb-50f5a3ee19e00"
Last-Modified: Wed, 18 Feb 2015 10:26:00 GMT
Server: ECAcc (sin/ECF4)
X-Cache: HIT
Content-Length: 21195
# curl -I -H "Host: cdn.mysl01.com" http://xxxxx.http.cdn.softlayer.net/images/ninja.png
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: image/png
Date: Sat, 21 Feb 2015 09:42:46 GMT
Etag: "11214d-52cb-50f5a3ee19e00"
Last-Modified: Wed, 18 Feb 2015 10:26:00 GMT
Server: ECAcc (sin/ECF4)
X-Cache: HIT
Content-Length: 21195
#終わりに
これを書くための動作チェックに色々時間かかりました。EdgeCast本家の解説記事が欲しい。。。