ShinobiLayer: SoftLayerでCNAMEを使ってCDNアクセスする（動作原理編）

#はじめに
ShinobiLayer: SoftLayerでCNAMEを使ってCDNアクセスする（設定編）
http://qiita.com/testnin2/items/af9848517477b3c45a4e
の解説編（？）です。設定編の記事を書く際によく分からなかったCDNの動作原理について、色々調査・検証した結果をまとめた感じの内容になります。

#設定編におけるまとめと疑問点
前回は以下のように設定することで、

* Customer Portalの設定<br> ![CDN02.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/b16ca0c5-3d98-3b8c-c47f-b85c7c0f19c7.jpeg)
* DNSの設定<br> ![CDN_DNS_new.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/ab32302c-c63a-8355-9839-f20d4acc0b15.jpeg)

以下の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側でも幾つか設定が追加されているようです。
![CDN02.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/b16ca0c5-3d98-3b8c-c47f-b85c7c0f19c7.jpeg)

1. Originサーバー（origin.mysl01.com）のキャッシュデータは、EdgeCast ServerのDocument Root配下の**/80xxxxx/origin.mysl01.com/**に配置される。よって、今回のケースだと、http://wpc.xxxxx.edgecastcdn.net **/80xxxxx/origin.mysl01.com** でアクセスできるようになる。

2. **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本家の解説記事が欲しい。。。