【初心者用】AWSで練習・検証用のWordPress環境を構築する

# はじめに
AWS初心者が練習・検証用にWordPress環境を立てた手順を、後から同じことがしたいと思った人向けにまとめた物です。
筆者が色々と失敗した際の経験も記載しておきます。
### 想定読者
・AWSでEC2のインスタンスを立てて接続した事がある程度の初心者
・Linuxの基本操作はわかる人
・**ある程度意図が説明された記事が読みたい人**

### 目的
・ちょっと知識がある人が、WordPress環境を実際に構築してその感覚を掴む。
・別の練習のために環境を構築する際に手順を理解・覚えておく。

### 構成環境
・EC2（WEB・DB）1台　OS:Amazon Linux2　※無料枠
実際に公開して運用する際は冗長性のためにEC2（WEBサーバ）とRDS（DBサーバ）に分けるのが鉄板構成のようですが、練習のため同居させます。

# 全体の流れ
1. 構築に必要なものを把握する
2. EC2インスタンスの起動、SSHで接続
3. Apache・PHP・MariaDBをインストール
4. MariaDBの初期設定
5. WordPressをダウンロード
6. Apacheの設定変更
7. WordPressの初期設定

# 1.構築に必要なものを把握する
WordPressは簡単にサイトを構築できる物ですが、それだけがあれば良い訳ではありません。

- WEBサーバ化させるミドルウェア「Apache」
- PHPで出来たWordPressを動かすための「PHP」
- WordPressのデータを保存するSQLデータベース
- WordPress本体

この4つがあることでWordPressでのWEBサイト構築・公開が可能になっています。
そもそも、自前で作った静的なサイトを公開するだけならば、Apacheをインストールするだけで可能です。
WordPressを稼働させるためにPHPとDB（データベース）を入れている訳です。

# 2.EC2インスタンスの起動、SSHで接続
### EC2インスタンスを起動
練習・検証用なので無料枠で十分です。
OSはAmazon Linux2にしておきましょう。
それ以外は特に必要はないですが、ポートの開放は必要です。
#### セキュリティグループの設定
・タイプ：SSH　 ポート範囲:22　ソース:マイIP
・タイプ：HTTP　ポート番号:80　ソース:マイIP　（こっちは別にフルオープンでも良い）

作業をするためにEC2にSSHでアクセスするために22を、WEBサイトとしてアクセスできるようHTTPの80を開放します。
開放先のIPは「0.0.0.0/0」とすると全世界からのフルアクセスとなり、悪意ある攻撃を受ける可能性もありますので、オススメはしません。
「マイIP」を選択すると自宅のIPだけに開放されるので安心です。

####注意
通常家庭のIPは一定期間やルーターの再起動等で変わります。
なので、後日接続できない事態が起こった場合はまずこの「マイIP」の部分を疑いましょう。
変更していた場合、もう一度「マイIP」と選択し直すと現在のIPに書き換えられるはずです。

###EC2にSSHで接続
EC2にSSHでアクセスして下さい。

```
sudo　su -
```

練習環境ですので、sudoコマンドでrootに移行して作業をする形にします。

# 3.Apache・PHP・mariaDBをインストール
それでは、各種必要な物をインストールしていきます。

### Apacheをインストール
Apacheをまずインストールさせ、systemctlコマンドで起動後、以降も自動的に起動するように設定します。

```
yum -y install httpd 
systemctl start httpd
systemctl enable httpd
```

#### 重要：ブラウザからアクセスが出来るか確認する事

Apacheがインストール出来た段階で、Apacheのテストページにアクセスする事ができます。
念の為、ブラウザからパブリックIPを入力してテストページが開くかどうか確認しておきましょう。
全て導入してからアクセス出来なかった場合、「原因は？」となりApacheも含めて全て確認するハメになります。
そのため、まずはここでアクセスできていればポートの「80」が空いていること・Apacheは稼働できている事が確認できます。
#### 余談
筆者はとある事情により、ポートが確認できない状況で一気にWordPress環境を構築した事があります。
しかし、アクセスできず、設定等を全て確認した後「ポートが空いてない事しか考えられない」と結論付けました。
この段階で、テストページの確認をしていれば「高確率でポートが空いていない」事に直ぐに気がつけた訳です。
### PHPをインストール
「Amazon Linux Extras」はAmazonがAmazon Linux2用に提供してくれているシステムで、対応が確認されている主要なパッケージを楽にインストールさせてくれるとても便利な物です。
その中で、今回はphp7.3のバージョンを適用化させるコマンドを入力します。

```
amazon-linux-extras enable php7.3 
```
そして、PHP以外にWordPressに必要な3つのPHPの拡張パッケージをまとめてインストールします。
３つの拡張パッケージはインストールしなくてもWordPressは起動はできるようですが、必要な物を入れない理由はないので素直に入れましょう。


```
yum -y install php php-gd php-mysqlnd php-xmlrpc 
```

### MariaDBをインストール
MySQLでも良いのですが、以前に最新バージョンによって旧来のコマンドで出来たことが出来なくなり、そこで詰まって何時間も時間を消費した経験があるため、MariaDBにしました。

```
yum -y install mariadb mariadb-server 
systemctl enable mariadb
systemctl start mariadb
```
Apacheと同様にインストールをした後、起動させてから以降も自動起動するようにします。

# 4.MariaDBの初期設定
MariaDBのセキュリティ設定とWordPress用のデータベースを作成します。
###セキュリティ設定

まず、最低限のセキュリティ設定を行います。

```
mysql_secure_installation
```
mysql_secure_installationコマンドは、rootのパスワードの変更や初期設定に存在するセキュリティ的に不用心な匿名ユーザーや初期DBを削除してくれるコマンドです。
練習のためにも、実際の運用で行うであろう設定は行っておきます。
解説すると長くなるので、細かな事はググった方が早いです。

```
Enter current password for root (enter for none) 
//　エンターを入力
Set root password [Y/n] 
//　Yを入力　※rootのパスワードを設定
New password:　
//　設定したいパスワードを入力してエンター、入力しても何も表示されないが正常。
Re-enter new password: 
//　再度同じパスワードを入力してエンター、このときも何も表示されないが正常。
Password updated successfully!　
//　パスワードが設定されました。
Remove anonymous users? [Y/n] 
//　Yを入力　※匿名ユーザーの削除
Disallow root login remotely? [Y/n] 
//　Yを入力　※リモートrootのログインの拒否
Remove test database and access to it? [Y/n] 
//　Yを入力　※テストDBの削除
Reload privilege tables now? [Y/n] 
// Yを入力　※権限テーブルをリロード

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
//　無事設定完了です。
```
これらはコマンド入力ではなく、対話的に行う設定です。

###データベース作成
WordPress用のデータベースを作成します。
そのために、mysqlにアクセスします。rootのパスワードは先程設定した物を入力しましょう。

```
mysql -u root -p　
```

**ここからはDBの操作になり、コマンド形式がLinuxと違いますので「；」を忘れないようにしましょう。**

#### ユーザーを作成
ユーザー名は「wordpress-user」とパスワードは「test-pass」とします。※名前は各々ご自由に

```
CREATE USER 'wordpress-user'@'localhost' IDENTIFIED BY 'test-pass';
```

####データベースを作成
「test-db」という名前にしておきます。※名前は各々ご自由に

```
CREATE DATABASE `test-db`;
```
#### 権限付与
GRANTで「ALL　PRIVILEGES」（検眼の付与以外の全ての権限）を「test-db」（DB)に対して「wordpress-user」（ユーザー）に付与します。

```
GRANT ALL PRIVILEGES ON `test-db`.* TO "wordpress-user"@"localhost";
```

下記は権限の設定をリロードするためのコマンドです。

```
FLUSH PRIVILEGES;
```
DBの操作を終了します。

```
exit;
```

#5.WordPressをインストール
まず、インストール先はWEBの公開ファイルなどを置くドキュメントルート下にしたいので、そこに移動します。

```
cd /var/www/html/
```
圧縮されたWordPressをダウンロード

```
wget https://ja.wordpress.org/latest-ja.tar.gz
```
展開します。これで「WordPress」フォルダが出てきているはずです。

```
tar -xzvf latest-ja.tar.gz
```
展開したので、不要になった圧縮ファイルを削除
削除する時に「本当に削除するの？」と聞いてきますがｙを入力すれば消してくれます。

```
rm latest-ja.tar.gz
rm: remove regular file ‘latest-ja.tar.gz’?　:y
```

lsコマンドを使って、その場に「wordpress」があれば問題ありません。

# 6. Apacheの設定変更
Apacheの設定と権限を変更します。
###Apacheの設定変更
WordPressはイントールできましたが、Apacheの設定変更をしなければ現状テストページにしかアクセスできません。
まず、Apacheの公開先（ドキュメントルート）を変更します。

設定を間違ってしまい、Apacheが動かなくなる事がありますのでバックアップを取っておくのをオススメします。

```
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd-Backup.conf　//バックアップの名前はご自由に
```
vimでApacheの設定ファイルである「httpd.conf」を編集します。

```
vim /etc/httpd/conf/httpd.conf 
```
公開先であるドキュメントルートを「 "/var/www/html/wordpress」に設定します。
元の設定は「"/var/www/html"」になっていると思います。

```httpd.conf
DocumentRoot "/var/www/html/wordpress"
```
また、続けてAllwOverrideをnoneからALLにします。
外部ファイルによってApacheの設定を変更可能にするかを設定するオプションで、これを設定しないとWordPressを使っているときに意図した動作が実行できない事が発生するようです。

```httpd.conf
<Directory "/var/www/html">
~~省略~~
AllowOverride All
```

### 権限の変更
chownコマンドによって「Apache」ユーザーと「Apache」グループに「/var/www」の所有者権限を与えます。
-Rオプションによって「再帰的」つまり、その中に存在しているもの全ての所有権をまるごと変えます。

「Apache」ユーザーは初期設定されているApacheの実行ユーザーで、これに権限を与えないとWordPressがDBに接続する事が出来なくなります。

```
chown -R apache:apache /var/www
```

### 【重要】Apacheの再起動

最後に、Apacheを再起動させましょう。
これをしないと設定が反映されないため、Apacheのテストページにしかアクセスできないままになります。

```
systemctl restart httpd
```
####余談
筆者は最後の「再起動」をしなかったために、設定が反映されずテストページにアクセスしてWordPressが起動せず、
「Apacheはちゃんと動いているのになぜ？」→「設定がおかしいはず」と無駄な設定確認に時間を費やしてしまった事があります。

# 7.WordPress初期設定
ここまでくればWordPressの初期設定画面にアクセスできるはずです。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901230/af0a62b0-590f-6857-6b8a-08057ee252ab.jpeg">

### データベースの設定
「MariaDBの初期設定」で設定した。
・データベース名
・ユーザー名
・パスワード（rootではなくユーザーのパスワードです）
この３つを入力しましょう。
データベースのホスト名とテーブル接頭辞はそのままで大丈夫です。
<img width="500"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901230/f6b7238a-496f-563c-d246-4d374db9d45c.jpeg">

インストールを押せば、サイトの設定画面に移行します。
手順にあった「chmod」で権限を変更していない場合、WordPressがDBに関する内容を設定ファイルを書き込む事が出来ないため、エラーとなりこの画面にたどり着けません。
<img width="500"　src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901230/24fc3d2c-3f34-c427-5352-681f7f44bc7a.jpeg">

### サイトの設定
あとは適当にサイトの名前やログインに必要なユーザー名・パスワード・メールアドレスを設定していきましょう。
外部に公開しない練習・検証環境であれば、「検索エンジンがサイトをインデックスしないようする」にチェックを入れておくと良いでしょう。
これは、Googleなどの検索エンジンからこのサイトに辿り着けないようにするための設定項目です。
<img width="500"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901230/14586f1e-ddda-38b3-bcfc-037830498aa6.jpeg">

### WordPressサイトの完成
これでサイトが完成しました。
先程設定したユーザー・パスワードでログインすれば管理画面でサイトを操作できます。
<img width="500" 　src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901230/f5ee0946-2552-2db6-e24a-5ccdab6094e5.jpeg">


#### データベース設定の別のやり方
##### wp-config.php
「/var/www/html/wordpress/wp-config.php」を編集することでここで入力した内容を変更する事もできます。
そもそも最初からこの方法でデータベース情報を入力しておけば、上記のブラウザでデータベースの設定を入力する必要はありません。

ただ、私個人的には「初回設定はブラウザで設定する方が短時間で済む上にミスが起きにくい」と思っています。
vimを使って編集して打ち間違いをした場合、ブラウザより修正の時間がかかるからです。

# 参考URL
- [チュートリアル: Amazon Linux 2 に LAMP ウェブサーバーをインストールする](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html)
- [HACKNOTE:WordPress基本構成パターン1-EC2インスタンス1台](https://hacknote.jp/archives/49167/)
- [【超初心者向け】WordPressをAmazon EC2インスタンスにインストールする](https://qiita.com/moomindani/items/9968df0d4396564bf74c)