Amazon Linux 2 で LAMP をインストールして WordPress 環境を構築する。

# はじめに
AWS公式ドキュメントに [Amazon Linux による WordPress ブログのホスティング](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/hosting-wordpress.html) というのがあります。
ですが、前提条件となる[LAMP環境](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html#prepare-lamp-server-alami)がphp7.2を使った手順となっているため、最新バージョンをベースにしたものとは言い難いです。
また、現在(2021/01/08)のWordPressの要件を見ると **「PHP バージョン 7.4 以上」****「MySQL バージョン 5.6 以上、または MariaDB バージョン 10.1 以上」**などとなっているため[要件](https://ja.wordpress.org/about/requirements/)を満たしていない状況です。
というわけで、今回はphp7.4とmysql8.0を使ったWordPress環境の構築を行いたいと思います。

# 構築環境
今回のバージョンは以下となります。

```text:環境情報
OS：Amazon Linux 2
PHP：7.4
MySQL：8.0.22
WordPress：5.6
```
また、EC2の立ち上げやSecurityGroupの設定等については触れませんので適宜対応してください。


# ソフトウェアパッケージのアップデート
まずは全てのソフトウェアパッケージを最新の状態にするため、ソフトウェアの更新を実行します。

```bash:パッケージアップデート
$ sudo yum update -y
```

# PHP
まず、phpのインストールを行います。AWSが用意しているリポジトリを利用してインストールを行い、必要になりそうなパッケージも追加でインストールしておきます。

## インストール
Amazon Linux Extras リポジトリをインストールして､Amazon Linux 2 PHP パッケージの最新バージョンを取得します。

```bash:phpバージョン確認
$ amazon-linux-extras list |grep php
 15  php7.2                   available    \
 17  lamp-mariadb10.2-php7.2  available    \
 31  php7.3                   available    \
 42  php7.4                   available    [ =stable ]
```

現時点での最新バージョンはphp7.4のためphp7.4のリポジトリをインストールします。

```bash:リポジトリインストール
$ sudo amazon-linux-extras enable php7.4
~~ 省略 ~~
Now you can install:
 # yum clean metadata
 # yum install php-cli php-pdo php-fpm php-json php-mysqlnd
```

リポジトリをインストールすると`Now you can install:`と表示されるので実行します。

```bash:メタデータの削除
$ sudo yum clean metadata
```

```bash:phpインストール
$ sudo yum install php-cli php-pdo php-fpm php-json php-mysqlnd
```

## 追加パッケージのインストール

その他、必要になりそうなパッケージをインストールしておきます。

```bash:追加パッケージ
$ sudo yum install php php-gd php-mbstring php-opcache php-xml php-common
```

## バージョン確認

```bash:バージョン確認
$ php -v
PHP 7.4.11 (cli) (built: Oct 21 2020 19:12:26) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.11, Copyright (c), by Zend Technologies
```

# MySQL
次はmysqlのインストールです。

## インストール
デフォルトだとリポジトリがないためMySQLのサイトからリポジトリを追加してインストールを行います。

```bash:リポジトリインストール
$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
```

```bash:mysqlインストール
$ sudo yum install --enablerepo=mysql80-community mysql-community-server mysql-community-devel
```

```bash:mysql起動
$ sudo systemctl start mysqld.service
```

```bash:mysql自動起動の有効化
$ sudo systemctl enable mysqld.service 
```

初回のrootパスワードは`mysql.log`に出力されます。

```bash:rootパスワード確認
$ sudo grep password /var/log/mysqld.log 
2021-01-06T02:45:38.728477Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: g1myqg3lgr#M
```

## rootパスワード変更
rootパスワードの初回変更を行わないと操作ができないため、パスワードの再設定を行います。

```bash:ログイン
$ mysql -uroot -p
```

パスワードは同じものを設定しても大丈夫です。

```bash:パスワード変更
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'g1myqg3lgr#M';
```

設定が完了したら一度ログアウトして再度ログインし直します。

## データベース作成
ログインし直したら、まずデータベースの作成を行います。

```bash:データベース作成
mysql> CREATE DATABASE wp_database;
```

## ユーザー作成
次にデータベースにアクセスできるWordPress用のユーザーを作成します。

```bash:ユーザー作成
mysql> CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'g1myqg3lgr#M';
mysql> GRANT ALL PRIVILEGES ON `wp_database `.* TO "wp_user"@"localhost";
mysql> FLUSH PRIVILEGES;
```

## ログイン確認

```bash:ログイン確認
$ mysql -uwp_user -p
```

## バージョン確認

```bash:バージョン確認
$ mysql --version
mysql  Ver 8.0.22 for Linux on x86_64 (MySQL Community Server - GPL)
```

# Apache
phpをインストールした時点でapacheは依存関連でインストールされています。
そのため起動させるだけでOKです。

## 起動
apacheを起動させ、自動起動設定を有効にします。

```bash:apache起動
$ sudo systemctl start httpd
```

```bash:apache自動起動の有効化
$ sudo systemctl enable httpd
```

### 確認

```bash:apacheバージョン確認
$ httpd -v
Server version: Apache/2.4.46 ()
Server built:   Aug 24 2020 18:54:20
```


# WordPress
必要となるソフトウェア周りの準備ができたので、最後にWordPressのインストールを行います。

## パッケージダウンロード
最新のパッケージをダウンロードします。

```bash:パッケージダウンロード
$ wget https://wordpress.org/latest.tar.gz
```

ファイル名で`latest.tar.gz`を指定すると最新のものがダウンロードされます。

```bash:パッケージ解凍
$ tar -xzf latest.tar.gz
```

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

```bash:wp-config.php作成
$ cp wordpress/wp-config-sample.php wordpress/wp-config.php
```

コピーした`wp-config.php`にmysqlのところで作成したデータベースとユーザーを設定します。
また、`Authentication Unique Keys and Salts`というセクションの部分で`KEY`と`SALT`を設定します。
以下のURLからランダムに生成されるキーセット値を取得して設定します。
https://api.wordpress.org/secret-key/1.1/salt/

```bash:wp-config.php修正
$ vim wordpress/wp-config.php
$ diff wordpress/wp-config-sample.php wordpress/wp-config.php
23c23
< define( 'DB_NAME', 'database_name_here' );
---
> define( 'DB_NAME', 'wp_database' );
26c26
< define( 'DB_USER', 'username_here' );
---
> define( 'DB_USER', 'wp_user' );
29c29
< define( 'DB_PASSWORD', 'password_here' );
---
> define( 'DB_PASSWORD', 'g1myqg3lgr#M' );
49,56c49,56
< define( 'AUTH_KEY',         'put your unique phrase here' );
< define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
< define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
< define( 'NONCE_KEY',        'put your unique phrase here' );
< define( 'AUTH_SALT',        'put your unique phrase here' );
< define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
< define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
< define( 'NONCE_SALT',       'put your unique phrase here' );
---
> define('AUTH_KEY',         '****************************************************************');
> define('SECURE_AUTH_KEY',  '****************************************************************');
> define('LOGGED_IN_KEY',    '****************************************************************');
> define('NONCE_KEY',        '****************************************************************');
> define('AUTH_SALT',        '****************************************************************');
> define('SECURE_AUTH_SALT', '****************************************************************');
> define('LOGGED_IN_SALT',   '****************************************************************');
> define('NONCE_SALT',       '****************************************************************');
```

## コンテンツコピー
WordPress をドキュメントルートで実行するために、コンテンツを次のようにコピーします。 
ここで気をつけるポイントはディレクトリ自体はコピーしないということです。

```bash:コンテンツコピー
$ sudo cp -r wordpress/* /var/www/html/
```

## WordPress のパーマリンク設定

WordPress のパーマリンクが正しく機能するには Apache の `.htaccess` ファイルを使用する必要がありますが、Amazon Linux はデフォルトで有効になっていません。Apache の ドキュメントルートですべての上書きができるように、`<Directory "/var/www/html">` で始まるセクションにある`AllowOverride`を`All`に修正します。

```bash:
$ sudo cp -pi /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf_org
$ sudo vim /etc/httpd/conf/httpd.conf
$ diff /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf_org
151c151
<     AllowOverride All
---
>     AllowOverride None
```

## 権限修正
WordPressで利用できる機能の中にはドキュメントルートへの書き込み権限が必要なものがあります(管理画面を使った、メディアのアップロードなど)。

まず、`/var/www` とそのコンテンツのファイル所有権を **apacheユーザー/グループ** に付与します。

```bash:所有権変更
$ sudo chown -R apache /var/www
$ sudo chgrp -R apache /var/www
```

次に `/var/www` と、そのサブディレクトリのグループ書き込み権限設定を行います。
setgidを設定することで、作成されたファイルはディレクトリが属するグループに属するようにしています。

```bash:権限変更(ディレクトリ)
$ sudo chmod 2775 /var/www
$ find /var/www -type d -exec sudo chmod 2775 {} \;
```

`/var/www` およびそのサブディレクトリのファイル許可を繰り返し変更してグループの書き込み許可を追加します。

```bash:権限変更(ファイル)
$ find /var/www -type f -exec sudo chmod 0664 {} \;
```

## apache再起動
一通り設定したらapacheの再起動を行います(httpd.confも修正したので)。

```bash:再起動
$ sudo systemctl restart httpd
```

## インストール
ブラウザアクセスを行いインストールを行います。
言語選択画面では **日本語** を選択します。
![スクリーンショット 2021-01-06 12.45.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/c9826971-4d5b-e66e-3c11-40e2a79f81f3.png)

項目を入力して **WordPressをインストール** します。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/bfa03082-8678-7735-4888-e74d98141b25.png)

**成功しました！** が表示されれば完了です。

![スクリーンショット 2021-01-06 12.48.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/d7bb4e7f-6f94-9ba6-0959-7c5b595d0f5a.png)


# おわりに
今回のやり方は汎用的な方法なので、今後phpやmysqlの新しいバージョンがリリースされた場合は、それに応じてバージョンを上げていけば対応できると思います。

# 参考
- [ja.wordpress.org - WordPress を実行するには、以下のホスティング環境を推奨します。](https://ja.wordpress.org/about/requirements/)
- [docs.aws.amazon.com - チュートリアル: Amazon Linux 2 に LAMP ウェブサーバーをインストールする (ステップ 1: LAMP サーバーを準備する)](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html#prepare-lamp-server)
- [docs.aws.amazon.com - チュートリアル: Amazon Linux による WordPress ブログのホスティング](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/hosting-wordpress.html)
- [MySQL 8.0 Reference Manual - 2.5.1 Installing MySQL on Linux Using the MySQL Yum Repository](https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html)
- [MySQL Community Downloads](https://dev.mysql.com/downloads/repo/yum/)