IBM Cloud CISの動作確認(5) -cache編-

##目的
IBMCloud InternetServicesを活用して、CISを経由したWebサーバへのロードバランスを試す。
今回は、マルチAZ環境でCISのグローバルロードバランサ(GLB)の環境でキャッシュ機能の動作確認をする。
<font color="Red">CISは30日間無料でお試しできる</font>ので是非やってみましょう

六部に分けて記載する予定です。

* 初期導入編:[IBM Cloud CISの動作確認(1) -初期導入編-](https://qiita.com/khoshina/items/e9b397f498330faefdd9)
* 証明書設定編:[IBM Cloud CISの動作確認(2) -証明書編-](https://qiita.com/khoshina/items/d29a936d72930f34fcf5)
* 動作確認編:[IBM Cloud CISの動作確認(3) -動作確認編-](https://qiita.com/khoshina/items/1dc8703c9830360bc250)
* GLB編:[IBM Cloud CISの動作確認(4) -GLB編-](https://qiita.com/khoshina/items/835d6f35183c8f654086)
* cache編:（**本ページ**)
* セキュリティ編:[IBM Cloud CISの動作確認(6) -Security編-](https://qiita.com/khoshina/items/ca8b01d8a0b05734817b)

##環境
* ローカル端末：macOS Catalina 10.15.6 1台
* プラットフォーム:IBMCloud
    * CDNサービス：IBM Cloud Internet Services 1サービス(Freeプラン)
    * ロードバランシングサービス:IBM Cloud Load Balancer 1サービス(Public to Private)
        * TOK04サーバ:CentOS 7.7.1908(Virtual Server for Classic) 2台
    * TOK05サーバ:CentOS 7.7.1908(Virtual Server for Classic) 1台

###概要構成図
**TOK05/TOK04**
![kou検証_日々更新.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/72b31d93-bac6-7390-36bd-a3f65efa205b.png)

##はじめに
cf-cache-statusヘッダーの出力を見ることで、リソースがキャッシュされたかどうか確認できる。

下記ページより抜粋
[CloudflareのCDNについて理解する](https://support.cloudflare.com/hc/ja/articles/200172516-Cloudflare%E3%81%AECDN%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B)

* **HIT**:リソースはキャッシュで見つかりました。
* **MISS**:リソースはキャッシュで見つかりませんでした。オリジンサーバーから提供されました。
* **EXPIRED**:リソースはキャッシュで見つかりましたが、有効期限が切れています。オリジンサーバーから提供されました。
* **STALE**:リソースはキャッシュから提供されましたが、有効期限が切れています。オリジンと通信して更新されたリソースを取得することができませんでした。
* **BYPASS**:オリジンサーバーは、no-cache、private、またはmax-age=0に設定したCache-Controlヘッダーを介してキャッシュをバイパスするようCloudflareに指示しました。 Origin Cache-Controlを有効にしているとBYPASSが返されます。
* **REVALIDATED**:リソースはキャッシュから提供されましたが、有効期限が切れています。 リソースは、If-Modified-SinceヘッダーまたはIf-None-matchヘッダーによって再検証されました。
* **UPDATING**:リソースはキャッシュから提供されましたが、有効期限が切れています。 リソースはWebサーバー（オリジンサーバー）によって更新されています。 通常、UPDATINGは、非常に人気のあるキャッシュされたリソースでのみ見られます。
* **DYNAMIC**:リソースコンテンツタイプはデフォルトでキャッシュされてません。現在のCloudflareキャッシュ設定は、リソースをキャッシュするようCloudflareに指示していません。  代わりに、リソースがWebサーバー（オリジンサーバー）からリクエストされました。 Page Rulesを使用して、カスタムキャッシングオプションを実装してください。


##キャッシュ動作の確認
`ローカル端末での作業`

**まず前提として、htmlファイルはキャッシュされない。**
**キャッシュされるのは静的コンテンツのみなので、jpgファイルを用意してテストした。**

originに「pic.jpg」を配置し、初回アクセスしてみる。
Edgeにキャッシュがないので、Edgeからoriginにファイルを取りに行っていることがわかる。
**cf-cache-status: MISS**

また、キャッシュ保持時間が3600秒であることがわかる
**cache-control: max-age=3600**

またキャッシュ保持から26秒経過している。
**age: 26**

```
% curl -s -I https://glb.m365.work/pic.jpg
cache-control: max-age=3600
cf-cache-status: MISS
age: 26
```

再度同じURLにアクセスしてみる。

今度はEdgeサーバが所持しているキャッシュにHITしているので、originへの通信までいっていない事がわかる。
**cf-cache-status: HIT**

またキャッシュ保持から203秒経過している。
**age: 203**

```
% curl -s -I https://glb.m365.work/pic.jpg
cf-cache-status: HIT
age: 203
```
###キャッシュパージ
`IBM Cloudポータルでの作業`
Edgeサーバが保持しているキャッシュをパージし、キャッシュ保持時間を1800秒に変更してみる。
![Cloud_Internet_Services_-_IBM_Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/0df53f8c-799b-d574-77f5-0e4a736d81b2.png)

`ローカル端末での作業`

アクセス確認
キャッシュパージを行ったので、キャッシュ有効期限が期限切れとなり、新しくoriginからコンテンツを取得している。
**cf-cache-status: EXPIRED**

また、キャッシュ有効期限を1800秒に変えたのが反映されている。
**cache-control: max-age=1800**

```
% curl -s -I https://glb.m365.work/pic.jpg
cache-control: max-age=1800
cf-cache-status: EXPIRED
```



参考:[Cloudflareキャッシュレスポンス](https://support.cloudflare.com/hc/ja/articles/200172516-Cloudflare%E3%81%AECDN%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B)
参考:[キャッシングに関するページ・ルールの使用](https://cloud.ibm.com/docs/cis?topic=cis-use-page-rules-with-caching&locale=ja)

###STALEの動作確認(不整合コンテンツ)
`IBM Cloudポータルでの作業`
Edgeサーバがキャッシュしていれば、originサーバがダウンしていてもコンテンツを返す。
本機能が有効に動作しているか、確認した。

![Cloud_Internet_Services_-_IBM_Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/e947ec60-3577-160c-e38d-a749cb9d07c4.png)

`ローカル端末での作業`
はじめに、Webサーバのサービスを停止する。

```
# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
```

キャッシュ済みのコンテンツにアクセスしてみる。
max-age1800に対して、8564秒経過しているがキャッシュHITにより、HTTP200 OKが返ってくる。
また、有効期限が切れているがEdgeからのキャッシュが返されている。
**cf-cache-status: STALE**

```
% curl -s -I https://glb.m365.work/pic.jpg
HTTP/2 200
cache-control: max-age=1800
cf-cache-status: STALE
age: 8564
```

##ページ・ルール
`IBM Cloudポータルでの作業`
参考:[キャッシングに関するページ・ルールの使用](https://cloud.ibm.com/docs/cis?topic=cis-use-page-rules-with-caching&locale=ja)

指定したページにマッチしたアクセスが来た場合、に特定のルールを適用させる機能をいくつか試してみた。
**パフォーマンス** -> **ページ・ルール** -> **ルールの作成**を選択
![Cloud_Internet_Services_-_IBM_Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/2b055019-d747-b78b-d77a-367a9bf1cae3.png)

**「\*.m365.work/\*」**でアクセスが来た場合の動作とし、**有効**をオンにしてルールを決める。
![貼り付けた画像_2020_09_17_9_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/b7c188a9-b400-c58b-d61b-b7cb0bb2ee6c.png)

###ブラウザー・キャッシュTTL
ブラウザーキャッシュTTLを1day(86400)で強制する。
![Cloud_Internet_Services_-_IBM_Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/8abf700b-cf68-58f3-8adf-e74ad7db446a.png)
`ローカル端末での作業`
想定通り**max-age=86400**に書き換わった。

```
% curl -s -I https://glb.m365.work/pic.jpg
cache-control: max-age=86400
cf-cache-status: HIT
age: 3132
```

###キャッシュ・レベル
`IBM Cloudポータルでの作業`
**すべてをキャッシュ**にした場合、デフォルトではキャッシュされないコンテンツをキャッシュするか確認する。

![Cloud_Internet_Services_-_IBM_Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/f4f6ee1b-cdff-a47d-f1f9-88e51c6e75da.png)
`ローカル端末での作業`
変更前はキャッシュバイパスされている

```
% curl -s -I https://glb.m365.work/
HTTP/2 200
cf-cache-status: BYPASS
```

変更後、想定通りキャッシュされた。

```
% curl -s -I https://glb.m365.work/
cache-control: max-age=1800
cf-cache-status: MISS

% curl -s -I https://glb.m365.work/
cache-control: max-age=1800
cf-cache-status: HIT
age: 2
```

今度は、**すべてをバイパス**に変更し、全てのコンテンツをキャッシュしないか確認する。
htmlおよび静的コンテンツの双方でキャッシュされない事を確認。

```
% curl -s -I https://glb.m365.work/
cf-cache-status: DYNAMIC

k.calc.cca1129@Koujis-MacBook-Pro ~ % curl -s -I https://glb.m365.work/pic.jpg
cache-control: private
cf-cache-status: DYNAMIC
```

##ページ圧縮
`IBM Cloudポータルでの作業`
コンテンツ圧縮が機能するか確認する。
**パフォーマンス** -> **拡張** -> **Brotli圧縮**
![Cloud_Internet_Services_-_IBM_Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/f25e430e-3db9-0e44-5f09-3e3ef16241b5.png)

デフォルトは無効となっており、**gzip**で圧縮されている。
![https___glb_m365_work.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/24735f34-5240-fab4-1cc1-ff39ba6aa3ee.png)
![https___glb_m365_work.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/d8184480-91e3-a605-ead8-a1916bc63636.png)


有効にする
![Cloud_Internet_Services_-_IBM_Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/df59e5d6-5897-3bc2-37df-84f3938b92a6.png)

有効すると、Brotli圧縮されていることがわかる。
コンテンツサイズも微妙だが小さくなった。
![https___glb_m365_work.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/83a3545c-7d4f-af99-5456-372a85fccf5a.png)
![https___glb_m365_work.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/2eb81f51-0c81-cf16-82aa-0e370d604202.png)

##続きはこちら
[IBM Cloud CISの動作確認(6) -Security編-](https://qiita.com/khoshina/items/ca8b01d8a0b05734817b)