WordpressをEC2インスタンスにインストールする方法（Apacheのバーチャルホスト設定方法・Wordpress用DB作成方法も解説）

# 概要
* AWSのEC2インスタンスで稼働しているお手製HTMLホームページを、Wordpressに移行したので、その手順を記しました。いろいろ調べても、このパターンの記事がほぼなかったので、参考になればと思います。
* 当記事はあくまで上記が目的で記載していますが、「ヴァーチャルホスト機能を使って新たなドメインを作成する方法」「Wordpress用DBの設定方法」という観点はWordpressをEc2インスタンスに導入される方であれば共通するステップだと思います。

## 環境
* Mac
    * 機種ID：MacBookPro18,3
    * macOS：Monterey
    * チップ：Apple M1 Pro
    * メモリ：16GB

## 前提
* 現在運用中のお手製HTMLホームページ（WordpressなどのCMSを利用していません）を「現行HP」、Wordpressに移行して扱う予定のホームページを「新HP」と呼称して進めます。（最終的には同じURLになります）
* 現行HPについて、AWSのEC2インスタンスのGIPとお名前.comのドメインがDNSレコード設定で紐づいています。（=EC2インスタンスごと入れ替える、という手順は検討していません）
* 現行HPのドメインを、`sample.com`とします。
* 切り替えまでの間の新HPのドメインを、`wp.sample.com`とします。（勿論、切り替え後は`sample.com`になります）
* EC2インスタンスのOSはUbuntu 18.04.3 LTSです。
* ウェブサーバーは、 Apache/2.4.29です。
* ApacheのVirtualHost機能を使って現行HPと新HPのURLどちらとも、今のEC2に向かうようにします。
* 現行お手製ホームページのHTML/CSS内容をそっくりそのままWordpressに移行する、というような手順の検討や記載はしていません。現行HPからサイトマップやコンテンツも変更する予定なので、そこまで高次元で考慮して実施していないことを考慮ください。あくまで、同じサーバー・同じドメインで、運用的に楽なWordpressに移行したい、というのが今回の実施目的です。

# 実行手順
1.　お名前ドットコムのDNSレコード設定で、新HPのドメインを登録する
2.　Apacheのヴァーチャルホスト設定を行い、新HPの表示を確認する
3.　PHPのインストールを行う
4.　DBのインストール・接続設定を行う
5.　Wordpressのインストール・config設定・ファイルの所有者設定を行う

## ①お名前ドットコムのDNSレコード設定で、新HPのドメインを登録する
* お名前ドットコム→現行HPのURLを選択→DNSレコード設定→レコード追加で、ドメインを追加登録。以下のように記入します。
    * ホスト名：wp.sample.com
    * TYPE：A
    * TTL：300
    * VALUE：11.222.333.444
* DNSサーバのAレコードに2つのホストを「同じIPアドレス」で登録することがポイントです。
    * 今回の場合でいうと、`11.222.333.444`に2つのホストがあることになります。
* 補足：hostsファイルを使用して実行したい方は、上記必要ないと思います。別途リサーチされてください。

## ②Apacheのヴァーチャルホスト設定を行い、新HPの表示を確認する
### ヴァーチャルホスト設定（仮想ホスト設定）とは：
* 1台のサーバーで複数のウェブサイトを運用出来る技術です。運営するドメイン単位ごとにサーバーを設置していると、コストが抑えられますよね。特に今回みたいに切り替えまでの間のホームページや検証用環境として触りたいくらいの用途であれば、そのためだけにドメインを取るのも勿体無いですのでバーチャルホストが使われることが多いと思います。
* ホストごとに異なるドキュメントルートを構築できるので管理しやすく、それもメリットの一つです。
* あくまで1台のサーバーなので、アクセス集中やサーバー障害などが発生すると、全てのドメインに負荷がかかってしまいますので要留意です。ただ、ちょっと調べたら、バーチャルホストを使ってWordpressを10個くらいのサイトにインストールしている強者がいたのでびっくりしましたが、、、笑
* バーチャルホストそれ自体に名前解決の機能はありません。上述の通り、DNSレコード設定を行うのであれば、お名前ドットコムなどで登録する必要があります。
* VirtualHostについては、以下の記事が図解もあり非常にわかりやすく解説されています。
    * [VirtualHostとは？](https://blog.senseshare.jp/virtualhost.html)

### Apacheの設定ファイルを編集する
* 該当のEC2インスタンス（現行HPが動いているサーバー）に接続します。
* UbuntuでApache2.4のヴァーチャルホスト設定を確認する場合は、`/etc/apache2/sites-available`にあるconfファイルを確認します。
    * `httpd.conf`を編集する場合もあるので、それぞれのOSやApacheのバージョンを確認ください。

> CentOS版では /etc/httpd/に各種ファイルがあり、親玉は/etc/httpd/conf/httpd.confです。
> Debian系では /etc/apache2/の中であり、親玉は/etc/apache2/apache2.conf。
引用元記事：[ubuntu版 Apache2.4でバーチャルホストの設定](https://blog.at-human.com/2021/03/ubuntu-apache2-vhostconf/)


* 以下コマンドで現行HPの設定ファイルを編集します。

```terminal
sudo vi sample_homepage.conf
```

* 具体的には、以下のように一番下に追記します。

```conf
<VirtualHost *:80>
    DocumentRoot /var/www/html/wpsample_homepage
    ServerAdmin sample@sample.com
    ServerName wp.sample.com
    ErrorLog ${APACHE_LOG_DIR}/sample_homepage-error.log
    CustomLog ${APACHE_LOG_DIR}/sample_homepage-access.log combined
</VirtualHost>
```

* DocumentRootは、ドメインに紐付ける公開ディレクトリ。これからWordpressをインストールするディレクトリを記載します。
    * デフォルトでは`/var/www/html`です
    * 参考：[CentOS 7 の Apache httpd 2.4 に VirutalHost の設定をする手順](https://weblabo.oscasierra.net/apache24-centos7-virtualhost/)
* ServerAdminは、現行HPのものと同じです。
* ServerNameは、DNSレコード設定を行なったドメイン名と同じになります。
* ErrorLogやCustomLogは必須ではありません。

* 設定を有効にするコマンドを実施します。confファイルがあるディレクトリで、confファイル名を指定します。
```terminal
sudo a2ensite sample_homepage
```

* apache2を再起動します。
```terminal
sudo systemctl restart apache2
```

### 新しいURLが正常に表示されるか確認する
* `/var/www/html/`以下に、先ほど指定したものと同じ名前のディレクトリ`wpsample_homepage`を作成し、その中に`index.html`を新規作成します。
* `index.html`にHTMLで「TEST PAGE」などと記載しておきます
* 新URL`http://wp.sample.com`にアクセスして「TEST PAGE」が表示された場合、正常にバーチャルホスト設定ができています。
    * もちろん、`http://wp.sample.com/index.html`と明示的に指定してあげてもOKです。
    * 確認ができましたら、ここのディレクトリはあとでWordpressが入ってくるので、`index.html`は削除しておきましょう。
* 補足1: `このサイトにアクセスできませんhttp://wp.sample.com のサーバーの IP アドレスが見つかりませんでした。`というエラーが表示された場合は、DNSレコード設定がうまくできていない可能性があります。もう一度、現行HPが登録されているDNSサーバーを確認し、上述の通りに登録されているか確認してください。
* 補足2: ドキュメントルート直下のファイルは、`index.html`でなくとも何でもいいです。`aaa.html`などとしても、`Index/of...`というページが表示されれば、正常にバーチャルホスト設定ができています。

## ③PHPのインストールを行う
* WordpressではPHPというサーバーサイドスクリプトやその拡張モジュールが必要になります。
* 今回は、現行HPで既にPHPを利用していたのでインストール手順は記載していません。新規にインストールが必要な方は、以下記事などに記載があるので、参照されてください。
    * [【超初心者向け】WordPressをAmazon EC2インスタンスにインストールする](https://qiita.com/moomindani/items/9968df0d4396564bf74c)
    * [AWSのEC2インスタンスでWordPressブログを公開してみよう](https://avinton.com/academy/amazon-ec2-wordpress/)
* PHPのバージョンが古いと、Wordpressでは「PHP Update Required」が表示されることがあります。なるべく最新版にしておくと良いと思います。バージョン指定のインストールも可能です。
    * 参考： [【Wordpress】PHP Update Requiredの対応方法について（EC2に接続してアップグレードする）](https://qiita.com/Ryo-0131/items/3cc96a623d577bca9ae0)
* phpMyAdminはブラウザからデータベースを確認することができるものですが、必須項目ではないので今回の構築手順では省いています。必要な方はこちらも上記記事にインストール手順の記載があります。

## ④DBのインストール・接続設定を行う
### DBをインストールする
* Wordpressのデータベースとして使用するMySQLやMariaDBをインストールします。
* 今回は、現行HPで既に使用しているMySQLサーバーがありますので、新規にMySQLをインストールする手順は記載していません。新規にインストール等から必要な方は、以下記事などに記載があるので、参照されてください。
    * [【超初心者向け】WordPressをAmazon EC2インスタンスにインストールする](https://qiita.com/moomindani/items/9968df0d4396564bf74c)

### Wordpress用のDB接続設定を行う
* データベース`wordpress-db`を新規作成します。
```sql
CREATE DATABASE `wordpress-db`;
```

* データベースのユーザーとパスワードを作成します。
```sql
CREATE USER 'wordpress-user'@'%' IDENTIFIED BY 'sample-wp';
```

* `wordpress-user`ユーザーの権限を追加します。
```sql
GRANT ALL PRIVILEGES ON `wordpress-db`.* TO "wordpress-user"@"%";
```

* 補足：Host名の`%`について
    * Host にワイルドカード文字の`%`を設定すると、全てのホストにマッチします。同DBサーバー内で完結する場合は、`'wordpress-user'@'localhost'`としていただいて問題ありません。
    * ただし、ワイルドカード`"_"`と`"%"`のマッチ順位は低く設定されており、誰でも何でも接続できるようになる完璧ワイルドカード！という訳ではありません。詳しくは以下記事にまとめられてあるので、ご参照ください。
        * 参考：[MySQLのユーザー管理について［その3］](https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0021)
    * ちなみに、ホスト名を指定しなかった場合には暗黙的に`"%"`が割り当てられます。


## ⑤Wordpressのインストール・config設定・ファイルの所有者設定を行う
### Wordpressをインストールする
* 該当のEC2インスタンス（現行HPが動いているサーバー）に接続します。
* ホームディレクトリで以下を実行。最新の WordPress を EC2 インスタンス上にダウンロードして展開（解凍）。

```terminal
wget https://wordpress.org/latest.tar.gz
tar -xzvf latest.tar.gz
```

### `wp-config.php`を編集する
* デフォルトで存在している`wp-config-sample.php`をベースにした`wp-config.php`を作成して編集します。
```terminal
cp wordpress/wp-config-sample.php wordpress/wp-config.php
vim wordpress/wp-config.php
```

* `wp-config.php`の編集内容は以下の通り。

```php
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress-db' );

/** Database username */
define( 'DB_USER', 'wordpress-user' );

/** Database password */
define( 'DB_PASSWORD', 'sample-wp-1234' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );
```

* `DB_NAME`、`DB_USER`、`DB_PASSWORD`は先ほど登録した通りです。
* `DB_HOST`は、先ほどDB設定を実施した同DBサーバー内であれば`localhost`で問題ありません。別のDBサーバーで設定していた場合は、そちらのIPアドレスを明示的に記載してあげる必要があります。

* インストールしたWordpressディレクトリを今回の新HPの公開ディレクトリへ移動します。
```terminal
cp -r wordpress/* /var/www/html/wpsample_homepage
```

* `http://wp.sample.com/wp-admin/install.php`にアクセスすると、Wordpressインストール画面が表示されます。

* 参考記事：
    * [EC2上にWordPressをインストールする](https://zatoima.github.io/wordpress-ec2-install.html#wordpress)
    * [【超初心者向け】WordPressをAmazon EC2インスタンスにインストールする](https://qiita.com/moomindani/items/9968df0d4396564bf74c)

### WordPressのファイルの所有者を「apache」とする
* 構築においてマストではないですがWordpressを運用するにあたっていずれ対応することになるTODOとして、「wordpress配下の所有者とgroupをapache所有とする」必要があります。テーマやプラグイン導入はすぐにやることだと思うので、ここで実施しておきましょう。

```
sudo chown -R www-data:www-data /var/www/html/wpsample_homepage
```

* apache所有者は、ubuntuでは`www-data`です。`apache:apache`で実施するという記事が多いのは、CentOSは`apache`ユーザーだからだと思います。ご自身のOSによって所有者やグループのところは置き換えてください。
    * 参考：[ubuntuのapacheユーザーとグループ](https://qiita.com/shim0mura/items/191350e892ea9a310127)
* 前が所有者・後が所有グループです。
    * 所有グループの情報は、`cat /etc/group`で確認できます。

### `Error establishing a database connection`と表示される場合
* 自分はこのエラーで少し悩まされたのですが、結論、`wp-config.php`の編集内容に誤りがある場合が多いと思います。もう一度、④で行なったDB設定の内容と`wp-config.php`の内容が一致しているか確認しましょう。
* 特に、現行HPと新HPの切り替え時では、現行HPと同じDBサーバー内でWordpress用のデータベースやユーザーを新規作成しているのか？という点も大事です。しっかり自分の環境を勘案して記載内容が間違っていないか？と考えて実施することが重要です。

## Wordpressを新規運用するにあたって対応したエラーなど
* [【Wordpress】PHP Update Requiredの対応方法について（EC2に接続してアップグレードする）](https://qiita.com/Ryo-0131/items/3cc96a623d577bca9ae0)
* [【Wordpress】アップロード時の"upload_max_filesize"エラーと"Unable to create directory"エラーを対応](https://qiita.com/Ryo-0131/items/a0133f6e37bcb8d32592)

## 参考記事
* [VirtualHostとは？](https://blog.senseshare.jp/virtualhost.html)
* [ubuntu版 Apache2.4でバーチャルホストの設定](https://blog.at-human.com/2021/03/ubuntu-apache2-vhostconf/)
* [CentOS 7 の Apache httpd 2.4 に VirutalHost の設定をする手順](https://weblabo.oscasierra.net/apache24-centos7-virtualhost/)
* [AWSのEC2インスタンスでWordPressブログを公開してみよう](https://avinton.com/academy/amazon-ec2-wordpress/)
* [MySQLのユーザー管理について［その3］](https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0021)
[EC2上にWordPressをインストールする](https://zatoima.github.io/wordpress-ec2-install.html#wordpress)
* [1つのEC2インスタンス上に複数のWordPressをホストする方法](https://zatoima.github.io/wordpress-ec2-multipul-host.html)
* [【超初心者向け】WordPressをAmazon EC2インスタンスにインストールする](https://qiita.com/moomindani/items/9968df0d4396564bf74c)
* [ubuntuのapacheユーザーとグループ](https://qiita.com/shim0mura/items/191350e892ea9a310127)