【超初心者向け】WordPressをAmazon EC2インスタンスにインストールする

この記事は、初めて Linux に触る方、初めて EC2 を使う方、初めて WordPress を構築する方向けに、その手順とそれぞれのステップの意味、ハマりがちなポイントとその解決方法を丁寧に解説することを目的としています。

（ほんとうは、私の Web ディレクターの友人が最近 Web のサーバーサイドの技術に関して勉強を始めたので、その方への説明のためだけに書いた記事です。もともとは公開するつもりはなかったのですが、もしかして他の方に役立つこともあるかもしれないと思ったので公開してみました。その友人はもともと技術屋さんではないので、サーバーサイドの技術に詳しくない方にもできるだけわかりやすく丁寧に説明してみたつもりです。）

ちなみに、基本的には、以下のふたつの AWS ドキュメントを踏襲しますが、この記事で全部完結するように書いていますので、リンク先を読まなくても大丈夫です。

- チュートリアル: Amazon Linux 2 に LAMP ウェブサーバーをインストールする https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html
- チュートリアル: Amazon Linux を使った WordPress ブログのホスティング https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/hosting-wordpress.html

以下のドキュメントを見て WordPress を構築できる方は、今回の記事の対象読者ではありません。

- WordPress のインストール https://ja.wordpress.org/support/article/how-to-install-wordpress/


# はじめに
今回つくるブログシステムには、WordPress というブログ用のソフトウェアを使います。
この WordPress を使うには、サーバーに自分でインストールして使う方法と、Wordpress.com といったサービスを利用して使う方法があります。
今回はあくまで Linux や EC2、WordPress とその周辺技術を勉強するための記事ですので、前者の方法をとります。

今回のブログシステムはシンプルに、以下を使用します。

- サーバー
    - Amazon EC2
        - インスタンスタイプ: t2.micro (1台)
        - オペレーティングシステム: Amazon Linux 2
- ソフトウェア
    - Apache
    - PHP
    - MariaDB
    - WordPress
- 開発用の環境
    - MacBook Pro

それぞれ説明していきます。

## Amazon EC2
Amazon Web Services (AWS) が提供する仮想サーバーのサービスです。
簡単に言うと、使いたいときにサーバーが使える、というサービスになります。
これを利用することで、サーバーを新しく購入して用意しなくても、インターネット越しに使うことができます。

EC2 におけるインスタンスタイプというのは、サーバーをどのくらい高性能にするか決めるものです。
今回はできるだけ無料利用枠を使用したいので、t2.micro という安価なインスタンスタイプを選びました。
WordPress でサンプルの記事を投稿してみるには十分でしょう。

オペレーティングシステムとは、コンピュータの基礎のシステムのことで、Windows とか Mac とかそういうやつです。
今回は Web システムで広く使われている Linux を勉強したいので、Linux を選びます。
一言に Linux といっても、いろいろな Linux がありますが、今回は AWS でオススメの Amazon Linux 2 (x86) を使います。

## Apache
Web サーバーのソフトウェアです。
ユーザーが Web ブラウザから送信するリクエストを受け付け、応答を返す役割を持ちます。

## MariaDB
データベースのソフトウェアです。
Web システム界隈で MySQL が広く使われていますが、MariaDB は MySQL から派生したデータベースです。
今回は、WordPress の投稿やコメント、設定情報などなど、WordPress に関するデータを保存する場所として使います。

## PHP
プログラミング言語のひとつです。
WordPress は PHP で書かれたソフトウェアで、これを実行するにはサーバーに PHP をインストールする必要があります。

## WordPress
ブログシステムを簡単に構築するためのソフトウェアです。

例えば、こういったソフトウェアの助けなしにブログのような Web サイトをつくろうと思うと、
HTML という言語でファイルを書いて、アップロードして、トップページからリンクを貼って・・・といった作業を記事更新の度にすることになります。
WordPress のおかげで、Web ブラウザーから簡単に記事を投稿したり管理したりできるわけです。

# インストールの流れ
これから実際に、WordPress を EC2 上に構築していきます。
全体の流れの概要は以下の通りです。
1. EC2 インスタンスを起動する
2. EC2 インスタンスに SSH で接続する
3. Apache をインストールする
4. PHP をインストールする
5. MariaDB をインストールする
6. (オプション) phpMyAdmin をインストールする
7. WordPress をインストールする

これからひとつずつ丁寧に見ていきます。

# 1. EC2インスタンスを起動する
**1-1. AWSマネジメントコンソールから、"EC2"を開きます。**

こんな画面が開きます。たくさんメニューがありますが、今回使うのはごくわずかです。全部理解しなくても大丈夫ですのでご安心を！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/cbf1b5c2-9156-1f26-a7b8-03c59d9b0830.png)

**1-2. 左側メニューから"インスタンス"をクリックします。**

まだ 1台も EC2 インスタンスがない状態ですね。では、記念すべき最初の EC2 インスタンスを起動してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/110b2379-da1d-0821-cafa-e4bd8fecc5f8.png)

**1-3. 画面左上あるいは中央の"インスタンスの作成"ボタンをクリックします。**

"ステップ1: Amazonマシンイメージ (AMI)" という画面が出てきました。この AMI というのは、さきほど説明したオペレーティングシステムがあらかじめ入ったテンプレートのことです。中華料理を作るときにクックドゥを使うみたいなもので、最初からオペレーティングシステムをセットアップしなくてもいいようにしてくれる便利な機能とご理解ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/7f130914-9f88-4485-2739-5fa7c35b9c94.png)

**1-4. "Amazon Linux 2 AMI (HVM)" の右側の "選択" ボタンをクリックします。**
ちなみに、"64ビット (x86)" と "64 ビット (Arm)" がありますが、これは元のまま、"64ビット (x86)" を選択したままとしてください。

すると、"ステップ2: インスタンスタイプの選択" という画面が出てきました。さきほど説明した、サーバーの性能を決めるインスタンスタイプを選ぶ画面です。ここでは、無料利用枠の対象になる "t2.micro" を選択しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/21d7bfe2-c35a-f2ea-9e65-e528eea3947e.png)

**1-5. "t2.micro" を選択して "次のステップ: インスタンスの詳細の設定" ボタンをクリックします。**

"ステップ 3: インスタンスの詳細の設定" という画面が出てきました。

今回は細かい設定は特に触らずにいきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/3edfe351-fa0c-e510-0681-ec682598f231.png)

**1-6. "次のステップ: ストレージの追加" ボタンをクリックします。**

"ステップ 4: ストレージの追加" という画面が出てきました。

ここは、サーバーのストレージのサイズ、つまり、データをどれくらい保存できるか設定する場所です。
デフォルトで 8GBになっていますね。今回はこのままでいいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/685129b4-c707-33ad-f7fb-616b769e2dcd.png)

**1-7. "次のステップ: タグの追加" ボタンをクリックします。**

"ステップ 5: タグの追加" という画面が出てきました。

ここでは、タグという、サーバーに名前をつけたりするためのものを設定します。
あとから何のサーバーだったかわからなくなるといけないので、今回は Name というタグに wordpress という値を設定してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/b1cd9d2c-6fa8-0720-7071-0f10350fca4c.png)

"タグの追加" ボタンをクリックして、キーの列に "Name"、値の列に "wordpress" と入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/2024b8d5-a7a6-3086-3d4f-4afea6cda135.png)

これでOK！次に進みましょう。

**1-8. "次のステップ: セキュリティグループの設定" ボタンをクリックします。**

"ステップ 6: セキュリティグループの設定" という画面が出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/afbfdf55-25e3-a88d-f890-f36f61545452.png)

ここでは、このサーバーに接続できる場所を制限できます。

（特に何も触れず最初の）画面の状態では、インターネットのどこからでもアクセスできるように 0.0.0.0/0 が許可されています。
また、許可するプロトコル（通信の方法）には "SSH" が選択されています。

今回はデフォルトの設定のままにしておきましょう。

**1-9. "確認と作成" ボタンをクリックします。**

"ステップ 7: インスタンス作成の確認" という画面が出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/87f7f90a-7e95-77d7-bff5-92f65a40ca56.png)

手順のとおりに設定できていれば、上の画面のようになっているはずです。

**1-10. "起動" ボタンをクリックします。**

"既存のキーペアを選択するか、新しいキーペアを作成します。" という画面が出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/7992d638-f6f0-8f64-b278-539b62d0bf0c.png)

キーペアというのは、このサーバーに接続するためのカギのことです。
今回は初めての EC2 インスタンスなので、既存のキーペアがひとつもない状態です。

"既存のキーペアの選択" プルダウンをクリックして、"新しいキーペアの作成" を選択します。
キーペア名には何かわかりやすい名前を入れます。私は苗字を入れることにしていますので "sekiyama" としましたが、あなたのお名前に置き換えて入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/30f1f66d-06b0-1f7f-5c19-3cde1c52806f.png)

この状態になったら、"キーペアのダウンロード" というボタンをクリックします。

Mac の場合はこんなファイルダウンロードのダイアログがでます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/4a059be7-7005-04e5-a710-226a21c3f12d.png)

ダウンロードしたキーペアは sekiyama.pem という名前のファイルになっています。
このファイルを、わかりやすい場所においておきます。
私は Mac の Firefox を使用していて ~/Downloads/ に sekiyama.pem がダウンロードされたので、今回はとりあえずそのままそこにおいておきます。

**1-11. "インスタンスの作成" ボタンをクリックします。**

しばらくグルグル画面が表示されたあと、"インスタンスは現在作成中です" という画面が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/a7a90831-2515-2200-2e77-91cff951eed1.png)

数十秒程度で EC2 インスタンスが起動します。
それでは、いま作成した EC2 インスタンスの様子を見てみましょう。

**1-12. "インスタンスの表示" ボタンをクリックします。**

こんな画面が表示されました。"wordpress" という名前がついたインスタンスが "running" となっていることがわかるでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/d2550671-9c89-061c-111a-6b8dab3ec34b.png)

これで、EC2 インスタンスの起動が完了しました。お疲れ様でした！


なお、今回は WordPress 用のサーバーなので、実際は HTTP プロトコルも受け付ける必要があります。
あ、「セキュリティグループに設定するの忘れた・・・」そのように焦った方、ご安心ください。
ちゃんと後から設定を追加することができるようになっています。

**1-13. 再度、左側メニューから "インスタンス" をクリックして、今回作成したインスタンスを選択します。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/66494078-6e52-fb4c-65fd-8f2546b9efc4.png)

画面下部のセキュリティグループの "launch-wizard-1" をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/b718696d-1d11-9104-46da-3ec6492204f8.png)

画面下部の "インバウンド" タブをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/b329b62e-6629-76e1-066a-c810fac8bd07.png)

"編集" ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/3706abd0-4db5-e472-37e4-086bc1eb5426.png)

"ルールの追加" ボタンをクリックし、タイプに "HTTP" を選択して "保存" ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/aa0b00c2-eb99-27ce-9530-91edf3b3d11d.png)

これで、このサーバーで HTTP の通信を受け付けるようになりました。


# 2. EC2インスタンスにSSHで接続する

それでは、起動した EC2 インスタンスに SSH という方法で接続していきます。

ちなみに、SSH 接続に関する AWS 公式ドキュメントはこちらです。
この記事では Mac の手順を説明していますが、Windows の場合はそちらをご覧ください。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html

**2-1. EC2 インスタンスの "パブリック DNS" を確認します。**

さきほどまでの手順で、EC2 インスタンスがこのように表示されている状態のはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/d2550671-9c89-061c-111a-6b8dab3ec34b.png)

この、画面の下に出ている "パブリック DNS" というのが、インターネットにおけるこのサーバーのドメイン名、住所のようなものです。
ここに記載された "ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com" をコピーしておきます。

ちなみに、EC2 ではインスタンスを停止して起動すると、このパブリック DNS が別のものに差し変わります。固定したい場合は Elastic IP アドレスというものを設定します。


**2-2. Mac でターミナルを起動します。**
Launchpad を開きます。
<img width="1128" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/2d683f16-b0df-2bf6-6e59-132cdb01f0da.png">

Other をクリックして、Terminal をクリックします。

<img width="946" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/729a1d88-47c2-206f-862f-807d25f5a537.png">

こんな画面が表示されました。これ以降の手順は、この画面にテキストを入力し、Enter を入力していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/d260c388-4bf4-b34a-f930-028d51431ea4.png)


**2-3. pem ファイルに適切なパーミッションを設定します。**

では、このターミナルから、前準備としてさきほどダウンロードした pem ファイルに適切なパーミッションを設定します。

以下のコマンドをコピー＆ペーストして入力して `Enter` を押します。
ちなみに、`pem ファイルの場所` については適宜置き換えて入力してください。

```sh
chmod 0600 [pemファイルの場所]
```

私の場合はこうなります。

```sh
chmod 0600 ~/Downloads/sekiyama.pem
```

この `0600` のような番号はこのファイルのパーミッション、つまり誰が何をできるかのアクセス権限を指しています。
`0600` という設定は、他の人にこのファイルを見られないようにするよ、ということです。
`chmod` は、ファイルのパーミッションを変更するコマンドです。
この pem ファイルは秘密鍵というとても大切なものですので、特にパーミッションを注意する必要があって、こういう作業をしています。

**2-4. SSH コマンドを実行します。**

では、早速ターミナルから、SSH コマンドを実行しましょう。
以下の `ssh` コマンドをターミナル画面にコピー＆ペーストして入力して `Enter` を押します。
ちなみに、`pem ファイルの場所`、`パブリックDNS` については適宜置き換えて入力してください。

```sh
ssh -i [pemファイルの場所] ec2-user@[パブリックDNS]
```

私の場合はこうなります。

```sh
ssh -i ~/Downloads/sekiyama.pem ec2-user@ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
```

`ec2-user` というのは、Amazon Linux 2 でデフォルトで用意している OS ユーザー名です。
ちなみに、今回は Amazon Linux なので `ec2-user` ですが、例えば CentOS だと `centos`、Ubuntu だと `ubuntu` だったりします。
Red Hat Enterprise Linux の場合は `ec2-user` の場合と `root` の場合があります。
コミュニティが提供している AMI の場合はその限りではないので、ユーザー名がわからない場合は提供元に確認してみてください。

以下のようなメッセージが出る場合は `yes` と入力して Enter を押します。

```sh
The authenticity of host 'ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com (XXX.XXX.XXX.XXX)' can't be established.
ECDSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXX.
Are you sure you want to continue connecting (yes/no)? 
```

この画面が出たら SSH 接続成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/f957f2c8-925b-6739-2110-8f8da7114de2.png)


# 3. Apache をインストールする

では、WordPress に使うための Web サーバー Apache (httpd) をインストールしていきます。

```sh
sudo yum install httpd -y
```

ここで使った `sudo` は、管理者ユーザーの権限でコマンドを実行するよ、という意味です。
`yum` は Amazon Linux 上にいろんなソフトをインストールするのに使います。ちなみに、yum は Amazon Linux だけではなくて、CentOS や Red Hat Enterprise Linux でも使えます。
`-y` は全部 "yes" だよ、つまりインストールの途中でいちいち質問しなくても全部 "yes" って答えとくよ、というオプションです。問答無用でインストールするときに使います。

こんなふうに Complete! と出たらインストール成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/7a0a28e1-68dc-b8ba-924f-bcad7e44c68a.png)

Apache を起動します。

```sh
sudo systemctl start httpd
```

`systemctl` は Amazon Linux の裏側を支える systemd という仕組みの管理コマンドです。
`systemctl start httpd` というコマンドにより、httpd (Apache) のサービスを起動するよ、という意味になります。

このままだと、サーバーを止めてもう一度起動したときに毎回 Apache (httpd) を起動しないといけないので、以下のコマンドを実行してサーバー開始時に自動的に起動するようにしておきます。

```sh
sudo systemctl enable httpd.service
```

次に、いま使っている `ec2-user` を `apache` グループに追加し、/var/www/ 配下にファイルを書き込めるようにします。

```sh
sudo usermod -a -G apache ec2-user
```

/var/www とそのコンテンツのグループ所有権を `apache` グループに変更します。 

```sh
sudo chown -R ec2-user:apache /var/www
```

グループの書き込み許可を追加します。

```sh
sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
find /var/www -type f -exec sudo chmod 0664 {} \;
```


# 4. PHP をインストールする

次に、WordPress に必要な PHP をインストールしていきます。

今回は PHP 7.3 を使いたいので、事前に以下のコマンドを実行して PHP 7.3 が参照されるようにしておきます。

```sh
sudo amazon-linux-extras enable php7.3
```

では、実際に PHP と関連するパッケージをインストールしていきます。

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

`Complete!` と出たらインストール成功です。

# 5. MariaDB をインストールする

次に、WordPress のデータベースとして使用する MariaDB をインストールしていきます。

```sh
sudo yum install mariadb mariadb-server -y
```

`Complete!` と出たらインストール成功です。

では早速起動します。

```sh
sudo systemctl start mariadb
```

Apache と同じように、MariaDB も自動起動するようにしておきましょう。

```sh
sudo systemctl enable mariadb
```

次に、mysql_secure_installation を実行します。

```sh
sudo mysql_secure_installation
```

以下のメッセージが出ます。データベースの `root` ユーザーのパスワードは現在設定されていないので、何も入力せず Enter を押します。

```sh
Enter current password for root (enter for none): 
```

以下のメッセージが出ます。データベースの `root` ユーザーのパスワードをこれから設定したいので 'Y' と入力して Enter を押します。

```sh
Set root password? [Y/n] 
```

以下のメッセージが出ます。安全なパスワードを 2回入力しましょう。ちなみに、キーボードを打っても何も表示されませんが、そのまま入力を続けてください。

```sh
New password: 
Re-enter new password: 
Password updated successfully!
```

以下のメッセージが出ます。「Y」と入力して匿名ユーザーアカウントを削除します。

```sh
Remove anonymous users? [Y/n] 
```

「Y」と入力してリモートルートログインを無効にします。

```sh
Disallow root login remotely? [Y/n] 
```

「Y」と入力してテストデータベースを削除します。

```sh
Remove test database and access to it? [Y/n] 
```

「Y」と入力して権限テーブルを再ロードし、変更を保存します。

```sh
Reload privilege tables now? [Y/n] 
```

`All done!` と出ると設定完了です。

# (オプション) 6. phpMyAdmin をインストールする

注：この手順はオプションで、必須のものではありません。ここをスキップしても WordPress の環境構築には影響しないので、はやく構築したい方はスキップして大丈夫です。

ちなみに、ここに phpMyAdmin をインストールする手順を含めた理由は、私の友人の馴染んだ環境にそろえるため (個人的な事情)と、SQL に馴染みがなくてもデータベースの中身を見て勉強できるようにするためです。
実際に WordPress を本番環境として使う場合は、セキュリティの懸念がありますので、この手順をスキップするか、何らかのアクセス制限を追加することになるでしょう。（「おわりに」でも少しだけ触れています。）

一方で、phpMyAdmin をインストールすることで、SQL に馴染みのない方でも、WordPress に使っている MariaDB データベースにどんな情報が格納されているのか、画面で簡単に確認できるようになります。
この記事を勉強のために読み進めている方は、試してみると楽しいかと思います。

phpMyAdmin 関連パッケージをインストールします。

```sh
sudo yum install php-mbstring php-fpm -y
```

Apache を再起動します。

```sh
sudo systemctl restart httpd
```

/var/www/html で Apache ドキュメントルート (Web サイトとして公開するトップページのディレクトリ) に移動します。 
ここで使っている `cd` というコマンドはディレクトリを移動するよ、change directory するよ、という意味です。

```sh
cd /var/www/html
```

phpMyAdmin をダウンロードします。`wget` はよくファイルのダウンロードに使われるコマンドです。

```sh
wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
```

phpMyAdmin フォルダを作成して、phpMyAdmin パッケージを展開（解凍）します。終わったら、元の tar.gz ファイルはもう要らないので `rm` コマンドで消します。

```sh
mkdir phpMyAdmin && tar -xvzf phpMyAdmin-latest-all-languages.tar.gz -C phpMyAdmin --strip-components 1
rm phpMyAdmin-latest-all-languages.tar.gz
```

これでインストール完了です。

Web フラウザから http://[パブリックDNS]/phpMyAdmin にアクセスしてみましょう。
ログイン画面が表示されたら、Username に "root"、Password にさきほど `mysql_secure_installation` で設定したパスワードを入力して "Go" ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/ee1d362c-81b9-4630-59fd-bb1d7f540b3f.png)

phpMyAdmin にログインできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/162574d0-f6ef-3166-47f2-af59757a03a6.png)


# 7. WordPress をインストールする

**7-1. WordPress のダウンロード**
これまでどおり、EC2 インスタンスに SSH 接続します。
最初に、ホームディレクトリに戻ります。

```sh
cd
pwd
```

まず、最新の WordPress を EC2 インスタンス上にダウンロードして展開（解凍）します。
`wget` はさきほど phpMyAdmin のダウンロードにも使った、ファイルのダウンロードに使われるコマンドです。
ファイルの末尾に tar.gz とあり、これは圧縮されていますので、`tar` コマンドで展開（解凍）します。

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

**7-2. WordPress のためのデータベースのセットアップ**
次に、mysql クライアントを使って MariaDB に root ユーザーでログインします。

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

ログイン成功しました。

```sh
$ mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 26
Server version: 5.5.64-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```

ここから先の手順では、SQL というデータベースを操作する言語を、以下の `>` の後ろに入力していきます。

```sql

MariaDB [(none)]> 
```

`CREATE USER` によって、データベースのユーザーとパスワードを作成します。
`your_strong_password` の部分はご自身で考えた独自のパスワードに置き換えます。

```sql
CREATE USER 'wordpress-user'@'localhost' IDENTIFIED BY 'your_strong_password';
```

ちなみに、ここで作成したユーザーは `mysql_secure_installation` で作成した `root` ユーザーとは別のものです。
WordPress からデータベースへの接続には、ここで作成した `wordpress-user` のほうを使います。
後述の手順でデータベースのパスワードを使いますが、ここで設定したパスワードのことですのでご注意ください。

`CREATE DATABASE` によって、データベースを作成します。

```sql
CREATE DATABASE `wordpress-db`;
```

`GRANT` によって、データベースに対して、さきほど作成した `wordpress-user` ユーザーの権限を追加します。

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

すべての変更を有効にするため、データベース権限をフラッシュします。

```sql
FLUSH PRIVILEGES;
```

mysql クライアントを終了します。

```sql
exit
```

ここまで手順を進めると、phpMyAdmin の左側のデータベースツリーに新しく `wordpress-db` が現れます。
つくったデータベースが見えると、ステップが進んでいる実感がわきますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/cf075c72-fc40-34ca-2263-e89902b42470.png)

**7-3. WordPress のための設定**

いったんホームディレクトリに戻ります。

```sh
cd
pwd
```

wp-config-sample.php ファイルを wp-config.php という名前でコピーします。

```sh
cp wordpress/wp-config-sample.php wordpress/wp-config.php
```

`vim` で wp-config.php ファイルを編集します。

```sh
vim wordpress/wp-config.php
```

`DB_NAME` を定義している行まで矢印キーで移動します。vim では 'i' を押すと編集モード、'Exc' を押すと元のモードにもどります。
この vim を使って、

```sh
define( 'DB_NAME', 'database_name_here' );
```

を

```sh
define( 'DB_NAME', 'wordpress-db' );
```

に書き換えます。

同じように、vim で

```sh
define( 'DB_USER', 'username_here' );
```

を

```sh
define( 'DB_USER', 'wordpress-user');
```

に書き換えます。また、

```sh
define( 'DB_PASSWORD', 'password_here' );

```

を

```sh
define( 'DB_PASSWORD', 'your_strong_password');
```

に書き換えます。

書き換え終わったら、':wq' を入力して Enter を押して vim を閉じます。

**7-4. WordPress ファイルの配置**

今回は、WordPress をドキュメントルートではなく、その下の子ディレクトリで実行しようと思います。

```sh
mkdir /var/www/html/blog
cp -r wordpress/* /var/www/html/blog/
```

これで、wordpress ディレクトリにあったファイルは全部 /var/www/html/blog/ ディレクトリにコピーされました。
実際に WordPress として使うファイルはこのコピー先の /var/www/html/blog/ ディレクトリにあるものになります。


**7-5. httpd.conf の修正**
WordPress のパーマリンクが機能するには Apache の .htaccess ファイルを使用する必要がありますが、Amazon Linux ではデフォルトで有効になっていません。以下の手順で有効化します。

vim で httpd.conf ファイルを開きます。

```sh
sudo vim /etc/httpd/conf/httpd.conf
```

<Directory "/var/www/html"> で始まるセクションを見つけます。 

```
<Directory "/var/www/html">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None

    #
    # Controls who can get stuff from this server.
    #
    Require all granted
</Directory>
```

`AllowOverride` を `None` から `All` に変更します。

※ このファイルには複数の AllowOverride 行がありますが、必ず <Directory "/var/www/html"> セクションの行を変更してください。 

**7-6. Apache によるファイル書き込みの許可**
WordPress で使用できる機能の中には、Apache ドキュメントルートへの書き込み権限が必要なものがあります
以下のコマンドを実行して、Apache (httpd) プロセスが /var/www/ に書き込めるようにします。

```sh
sudo chown -R apache /var/www
sudo chgrp -R apache /var/www
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} \;
```

Apache を再起動します。

```sh
sudo systemctl restart httpd
```


**7-7. WordPress のインストール**

それでは、Web ブラウザで WordPress にアクセスして、インストールを完了させましょう。
以下の URL を Web ブラウザで開きます。なお、`パブリックDNS` については適宜置き換えて入力してください。

```
http://[パブリックDNS]/blog/wp-admin/install.php
```

実際は以下のようになります。

```
http://ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com/blog/wp-admin/install.php
```

言語選択画面が表示されました。日本語を選んで "Continue" をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/c43c28dd-0797-17f4-af40-f57c94c038f1.png)

各種設定値を入力して "WordPress をインストール" ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/f0bb8a8c-bb3a-0302-761e-de21132c098e.png)

ついに WordPress のインストールに成功しました！やったね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/66635d09-5525-c2b3-eb81-7439e8ab848d.png)

では、ブログ画面をみてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/ba4baf10-acb1-ef8d-316c-a8ed469919e3.png)

初期のブログ画面が見えました。今度は、ログインして管理画面をみてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/281cf526-b53d-4f07-1811-4cb74502f666.png)

管理画面にアクセスできました。これで一通りセットアップが完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/0260c822-91b7-24b2-30ef-596a041ccbf5.png)

# おわりに
ここまでで、WordPress を EC2 インスタンス上に構築することができました。

今後の発展としては、以下のようなアイデアが考えられます。

- HTTPS の使用
    - 現在では基本的に (HTTPではなく) HTTPS が必須です。
- カスタムドメイン名の使用
    - 本番の Web サイトとして公開する場合は、ドメインを取得して設定する必要があるでしょう。
- スケーラビリティの向上
    - 負荷分散装置の導入
    - 複数台サーバー構成の構築（アップロードしたファイルの置き場所がポイントです）
    - データベースの別サーバー化
- 運用方法の検討
    - Web サイトが正常に稼働しているか監視する必要があるでしょう。
    - 万一の誤操作や障害に備え、データを定期的にバックアップしましょう。
- セキュリティの検討
    - 今回の構成は "最初の一歩" としての勉強用ということで、本来検討すべきセキュリティをほとんど検討していません。本来は考慮すべき点が多数あります。
    - SSH (TCP/22) を 0.0.0.0/0 に公開するのはおすすめできないので、ネットワークを絞るか、そもそも SSH を許可せずに他の方法で管理するべきです。
    - phpMyAdmin へのアクセスにはリスクが大きいので、本番環境から外してしまうか、アクセスを制限する必要があるでしょう。

ちなみに、本来 AWS らしい構成にするなら、以下のようなサービスを活用することになるでしょう。

- Route 53
- ELB
- EC2
- Auto Scaling
- RDS MySQL/MariaDB or Aurora MySQL
- EFS

今回は勉強用ということで全部手作業で EC2 インスタンスに設定する手段をとりましたが、上記のように AWS のいろんなサービスを使うことで、もっと簡単にスケーラブルな WordPress を構築することは可能です。
しかし、そうは言っても、自前で手作業ですべて作業できたこと、それを完遂した経験は、本当に大切で貴重なことです。
その作業、その経験は決して無駄にはなりません。きっとあなたの力になるはずです。

さらに、非常にエクストリームな WordPress の活用としては、以下のようなものもあります。
- https://github.com/aws-samples/aws-refarch-wordpress
- https://templates.cloudonaut.io/en/stable/wordpress/

もし何をやっているかわからなかった箇所、ハマってしまった箇所などがありましたら、この記事にコメントいただけたらできるだけ加筆修正したいと思っています。
フィードバックお待ちしています。


# 付録: よくある質問

よくあるトラブルとその対応方法をまとめてみました。
ちなみに、初めて Linux や WordPress に触る方は、エラーメッセージが出るとびっくりしてしまうと思います。
でも、こういったトラブルシューティングはスキルアップの良い機会です。
落ち着いてひとつひとつ解決することで、着実にスキルアップにつながります。

## いつの間にか SSH 接続が切れてしまいました

しばらくターミナルの操作をしないでほっておくと、"Broken pipe" というメッセージが出て、SSH 接続が切れることがあります。

```
packet_write_wait: Connection to XXX.XXX.XXX.XXX port 22: Broken pipe
a483e77e9cc0:spark~magic sekiyama$
```

設定を変更すれば回避できるのですが、今回はそこまでは触れません。
落ち着いて、もう1回 ssh コマンドを実行しましょう。

```sh
ssh -i ~/Downloads/sekiyama.pem ec2-user@ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
```

## コマンドを実行すると "No such file or directory" と表示されました

そんなファイルはありませんよ、というエラーです。
おちついて、現在どこにいて、どのファイルを編集しようとしているのか、確認してみましょう。

pwd コマンドを実行すると、現在地のディレクトリがわかります。

```sh
pwd
```

ls コマンドで、そのディレクトリにあるファイルを一覧表示できます。

```sh
ls
```

ちなみに、ディレクトリを指定すると、そのディレクトリにあるファイルを一覧表示できます。

```sh
ls /var/www/html/
```

操作しようと思ったファイルがないなぁと思った場合は、cd コマンドで移動してみましょう。

cd コマンドで移動したい先のディレクトリを指定してそこに移動します。

```sh
cd /var/www/html/
```

ちなみに、cd だけ打って Enter を押すとホームディレクトリに飛びます。今回の場合は、/home/ec2-user/ です。

```sh
cd
```

## vim コマンドを実行したら真っ白な画面になりました

vim コマンドを実行したら真っ白な画面になった方もいるかと思います。
今回の手順では vim コマンドは既存のファイルの編集にしか使っていませんが、
存在しないファイルパスを指定したときは、新規のファイルの編集画面になります。つまり、真っ白です。

そんなときは慌てず、':q!' を入力して Enter を押して vim を閉じましょう。
':' は vim のコマンドを始める合図、'q' は終了、'!' は強制的に無理やりやるよ、という意味です。

今回の手順で新規ファイル作成画面になってしまったということは、おそらくファイルパスが違うのだと思います。
この場合も、ひとつ前で説明した pwd, ls, cd コマンドでファイルを探してみましょう。


## cp コマンドを実行したら "Permission Denied" と表示されました

書き込み先のフォルダに書き込み権限がなかったようです。
いま使っているユーザーのフォルダへの書き込み権限をつけるのが正攻法です。
今回の手順では、以下のコマンドがそれにあたります。

```sh
sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
find /var/www -type f -exec sudo chmod 0664 {} \;
```

ちなみに、コマンドの先頭に sudo をつけて root ユーザーの権限で無理やり配置することもできます。（こら）

## 編集したファイルがどこにあるのかわからなくなってしまいました

ファイルをどこに置いたのか忘れてしまったそこのあなた！大丈夫です、安心してください。
Linux には find という便利なコマンドがあります。これを使えば簡単に見つかりますよ。

たとえば、wp-config.php を探したい場合は、こんなコマンドを実行します。
これを打つと、ファイル名が wp-config.php となっているファイルをサーバー全体で探します

```sh
sudo find / -name "*wp-config.php"
```

## WordPress にブラウザでアクセスすると "Error establishing a database connection" と表示されました

WordPress がデータベースに接続しようとしたら失敗しました、というエラーです。

/var/www/html/blog/wp-config.php に設定したデータベース名、ユーザー名、パスワードが正しいか、もう一度確認しましょう。

## wordpress-user のパスワードを忘れてしまいました

wordpress-user のパスワードを再設定しましょう。
以下のコマンドを実行してデータベースに root ユーザーで接続します。

```sh
mysql -p root -u
(mysql_secure_installation で設定したデータベースの root ユーザーのパスワードを入力する)
```

以下のクエリを実行します。`new_password` は差し替えてください。

```sql
SET PASSWORD FOR 'wordpress-user'@'localhost' = PASSWORD('new_password');
```

"Query OK, 0 rows affected (0.00 sec)" と出たら成功です。

## 今回つくった WordPress のデータはどこにあるのでしょうか？普段は FileZilla を使っていたのですが、FileZilla は使わなくていいのでしょうか？

これ、実際に頂いた質問で、とてもいい質問だと思ったので答えます。

WordPress のデータは EC2 インスタンス、つまりサーバーの上にあります。
このサーバーの上にファイルを置く手段はなんでもよいのです。最終的に、サーバーの所定の場所にあれば。

今回の手順では、サーバー上で直接インターネットからダウンロードした WordPress の PHP ファイルを、サーバー上で編集していました。
なので、最初からファイルが全部サーバー上にあった状態です。

一方で、巷のいろんなサービスでは、FileZilla や FFFTP, WinSCP などを使ってファイルをサーバーにアップロードする手順を紹介しています。
これは、手元のノートパソコンで編集したファイルをサーバーにコピーするためでした。
ですので、実は今回の環境でも、手元のパソコンでファイルを編集して FileZilla でアップロードしてもよいのです。

いろんな手段を自由に使えて、世界が広がりますね。


### FileZilla で EC2 インスタンスにファイルをアップロードする
FileZilla で EC2 インスタンスに接続したい場合は、以下のようにします。

1. File>Site Manager からサイトマネージャ画面を開きます。
2. EC2 インスタンスへの接続を設定して、OK ボタンをクリックします。

<img width="920" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/f1ba319c-8ffe-9487-ef41-a86136404419.png">

- Protocol には "SFTP" を選択します。
- Host にはこのインタンスのパブリックDNSを入力します。
- Logon Type には "Key file" を選択します。
- User には "ec2-user" と入力します。
- Key file には pem ファイルのパスを入力します。私の場合は /Users/sekiyama/Donwloads/sekiyama.pem となります。

## 今回つくった MariaDB のデータはどこにあるのでしょうか？/var/www/html/phpMyAdmin でしょうか？

いいえ、違います。

実は phpMyAdmin はデータベースではなく、データベースをいじるためのアプリなのです。

実際のデータは MariaDB のデータベースの中、具体的には /var/lib/mysql にあります。
ただ、そのデータは SQL という言葉でアクセスするためのデータでして、ファイルとして表示してみてもよくわからないバイナリという形式になっています。
このため、`mysql` コマンドや phpMyAdmin といったアプリから閲覧・編集する仕組みになっています。

ちなみに、WordPress のインストールが全部完了した状態で、phpMyAdmin を開くと、こんなふうに wordpress-db データベースの中身が見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4413/306ab438-7de4-f9df-a5b1-6d99ef503386.png)