Azure App Service + Blob Storage + CDNで、WordPressを構築 / [2] Azure App Services + CDNでWordPressを構築する

# 全体のアーキテクチャ
前回投稿 [Azure App Services + Blob Storage + CDNで、WordPressを構築 / [1] 全体編](https://qiita.com/sm_bd/items/4f3fc628a1a45fd54f07) では、Azureを使って安く、セキュアに作れるWordPressについて、全体的な仕組みを書いておきました。

振り返りになりますが、全体としては、下のようなアーキテクチャを目指します。
![Architecture](https://camo.qiitausercontent.com/d72bc13bbeff1b1f19a201318400f7db0925d1bd/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3634353531352f30616338343961642d333864342d623631342d343032342d6166643038626139646264652e706e67)
この中で、この記事では、Azure App ServiceとAzure CDNを使って、WordPressの構築するところを扱います。

# App ServiceでのWordPress作成(Webアプリの作成)
いきなり人任せで恐縮だが、
Azure App ServiceでのWordPress作成は、下の記事が非常によくまとまっているので、まずはこちらを読んで欲しい。
[AzureでWordpressのサイトを構築する。 | IT長のネタ帳](https://www.d3654.be/construct-website-using-wordpress-on-azure/)

ただAzureあるあるで、時間が経過して、UIが変わっているため、その部分だけ書いておこう。

まず、WordPressのテンプレートへのたどり着き方だが、App Serviceのページからではなく、Marketplace経由になっているようだ。

▼Azure PortalでMarketplaceにアクセスし、
![marketplace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645515/c4de10d9-8326-3301-0244-9154a9f2739d.png)

▼WordPressを選択して、
![marketplace_wp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645515/9e3c8643-cd08-c777-1961-7892bd72831b.png)

▼インストールする。
![wordpress_make.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645515/feb3d3a7-ef28-07f3-0673-a0396a90ec97.png)

ここから先の作成画面も、多少変化しているものの、流れは同じなので、困ることはないと思う。

価格レベルは、今回のように別途のストレージを用意したり、CDNを使うことで、アクセス負荷の分散化や、カスタムドメインの設定を実現したりすれば、Free(F1)プランでも構築できるし、私もそれで作っている。ただAzure純正のバックアップツールを使えないのは、若干気がかりかもしれない。

なおリソースグループは、アクセス権限の構成単位としても機能する。後からでも移動はできるようだが、Azure Automationで諸々の自動化をすると、移動した際にスクリプトを書き換える羽目になるので、そうならないようにしたい。

# Azure CDNの設定

### CDNを使う目的
CDNというと、一般には、ページの表示高速化が目的だが、今回はむしろ、次のような目的を狙っている。

- アクセス過多によるWeb Appのダウンを避ける
    - Web Appは価格レベルによって、1日あたりの、CPUの稼働時間や、データの送信量の上限がある。それを超えてしまうと、24時間が経過して上限がリセットされるまで、いわゆる「鯖落ち」してしまう。
    - そこで、ユーザーはCDNのエンドポイントにアクセスしてもらい、Web Appはなるべく動かないようにするのである
    - CDNは従量課金なので、アクセスがあればその分だけ料金が発生するものの、ダウンしてしまうことはない
- カスタムドメイン(独自ドメイン)を設定する
    - Azure App ServiceではBasic以上の価格レベルでないと、カスタムドメインを設定できない
    - CDNは無料で設定可能なので、CDNをフロントに置くことで、無料でWordPressのサイトを独自ドメインで運用できることになる
- SSL化をする
    - これもカスタムドメインと同じ理屈
    - (ただし最近、App Serviceでも無料でできるようになった模様)

### CDNの構成
これまた手抜きで申し訳ないですが、下記のブログがよくまとまっていたので、参考にして欲しい。
[WebApps ＋ Azure CDNを使い年間1,000円程度で独自ドメイン・SSL対応済み高負荷対策なWordPressサイトを 作ってみた話。 | nrjlog](https://zuvuyalink.net/nrjlog/archives/3528)
今回のアーキテクチャの骨格も、こちらの、のりじさんのブログ記事がベースになっている。

##### 違ったところ
上で紹介したブログでは、ドメイン所有者へ確認メールが来るとのことだったが、特に何も来ず、無事に終了した。
ただしSSL化自体は、かなり長い時間かかった。操作から実際に有効になるまで、24時間くらいはかかると見ておいたほうが良い。

# CDNでのエンジンルール設定
CDNを組み合わせたときに、WordPressの管理画面にどうアクセスするか？ということが問題になる。
当たり前だが、
①管理画面は配信元へアクセスする (`***.azurewebsites.net/wp-login.php`)
②管理画面はCDNを経由する (`カスタムドメイン/wp-login.php`)
のどちらかになる。

### ①はむずかしい
私も最初は①を想定して、アレコレ試したのだが、WordPressの仕組み上、難しそうだ。

というのも、①で構築すると、 WordPressの設定で、

- WordPressアドレス <実際にWordPressを置いている場所> は、`***.azurewebsites.net`
- サイトアドレス <サイトにアクセスしてもらうURL> は、独自ドメイン
 
と異なるURLを設定しないといけないのだが、
これをすると、色々と不具合が発生してしまい、それらを解消する手立ても、調べたものの、見つからなかった。

### なので②を推奨
②の場合、
CDNは、キャッシュをCDNのサーバーに保存して配信する仕組みなので、管理画面のように、ログインして入るような画面や、頻繁に内容が変わるサイトには向いていない、という問題がある。

そこで、CDNにキャッシュ規則を設定することで、管理画面だけは、CDNにアクセスしても、キャッシュを保存しない設定にしておくことが必要となる。

これによって、`独自ドメイン/wp-login.php`から管理画面に入っても、CDNのサーバーは通過するだけで、毎回、App Serviceのオリジンサーバーに繋がるようになり、上述の問題を回避できる。

### Azure CDNでのキャッシュ規則の設定
**※ここでは、Azure CDNにて、Verizon Standardを使用した際の例を紹介します。**

▼先程作成した、Azure CDNのプロファイルにサクセスし、さらにエンドポイントを選ぶ
![cdnoverview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645515/bf30dac7-8076-1c33-5507-69e90bc264b0.png)

▼「キャッシュ規則」を選択して、
![cdnrule2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645515/e702bb5b-1d2a-f57f-60b0-e025b7c22a0e.png)

「グローバルキャッシュルール」のうち、
「クエリ文字列のキャッシュ動作」は、~~「クエリ文字列に対するキャッシュをバイパス」~~「一意のURLをすべてキャッシュ」を指定

「カスタムキャッシュルール」は、以下の2つを設定
一致条件 パス ,  一致する値 /wp-admin/* ,  キャッシュ動作 キャッシュのバイパス
一致条件 パス ,  一致する値 /wp-login.php ,  キャッシュ動作 キャッシュのバイパス

なお、WordPressの管理画面へのログインページのURLは、セキュリティ上、変えておくことが望ましいが、その場合は、/wp-login.php に加えて、新しいURL( 例えば、/signinpage )も、同様にカスタムキャッシュルールを設定しておく必要がある。

**追記(2020/6/4)**
クエリ文字列の設定は「一意のURLをすべてキャッシュ」とすべきのようです。当初、間違ったことを書いており、すみません。
WordPressでは、PHPにクエリ文字列を使っており、スルーしてしまうと毎回オリジンに取りに行くことになる、クエリ文字列を無視してしまうとCSSの変更などが反映されなくなってしまうようです。
クエリ文字列もキャッシュすると、記事のプレビュー等で支障がでないか気になったのですが、WordPressでは、管理画面にログイン中はHTTPヘッダに「Cache-Control: no-cache」が付与されており、支障ないようです（動作確認済み）。とは言え、CDNではキャッシュの事故(e.g. メルカリの個人情報漏洩)と隣合わせですので、カスタムキャッシュルールで管理画面をスルーさせる設定は、変わらず実施したほうが良いと思います。

# WordPressでのURLの設定変更
ここまでで、WordPressは、一般からのアクセスも、管理画面も、独自ドメインのURLになる。
そこでWordPress側の設定も、URLの設定を変えておく必要がある。

普通であれば、WordPressの管理画面から変更できるのだが、Azure Marketplaceのテンプレートを使うと、ロックされてしまっている。
そのため、App Serviceの「App Service Editor」を用いて、WebアプリのPHPコードを直接書き換える。

### App Service Editorを用いて、 wp-config.php を編集
Azure App Serviceで、WordPressをインストールしたWebアプリを選択して、
▼App Service Editorを開く
![appserviceeditor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645515/c9109e3b-4083-ce1c-4802-ae235fcc80e5.png)

★ここからのPHP編集では、念の為、編集する前に、既存の内容をメモ帳にコピーして、不具合が起きたときに戻せるようにしておくことをおすすめします！！

▼wp-config.phpを開く
![wpconfig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645515/e3644e55-dc15-dcab-82cc-6596fcec2e6f.png)

`define('WP_HOME',...` と `define('WP_SITEURL',...` という記述が見つかるはずだ。
そこを新しいURLに変更する。
例えば、独自ドメインで、`https://www.cotoso.com` とした場合は、次のように記入する。

``` wp-config.php
define('WP_HOME', 'https://www.cotoso.com');
define('WP_SITEURL', 'https://www.cotoso.com');
```
URLの最後に`/`は書かないらしい。
なお、その下にあるWP_CONTENT_URL などの記述は、相対パスでの記述になっている限り、変更する必要はない。

# つづき
ここまでで、App ServiceでWordPressを動かし、CDNで配信させるアーキテクチャが整った。

しかし、Webアプリのストレージが圧迫されないように、画像を別途ストレージに置いたり、ユーザーがApp Serviceのオリジンサーバーに直接アクセスしないようにしたりする必要がある。

これらの方法については、別途記事を用意したいと思う。

- [[3] Azure Blob StorageをWordPressで利用する](https://qiita.com/sm_bd/items/4aeab758750cf4b89623)
- [4] Azure CDNのPOPサーバーを取得し、Azure Web AppsのIP制限を自動で構成する <作成中>

# リファレンス
ここまでで紹介した記事以外では、下記を参考にした。
- [WordPressのCDN化 - SlideShare](https://www.slideshare.net/tech_jstream/wordpresscdn)
- [WordPressの高速化(Azure CDNの利用) | なりきりアーキテクト](https://architect.slowcat.net/wordpress/cdn/)