EC2 + RDS + Nginx + PHP8 + Adminer でWordpressを構築

#はじめに
nginxとphp-fpmの設定の兼ね合いで一部苦戦したため、書き留めます。

#前提条件

- vpc,ec2,rds作成済み
    - rds作成時、databaseを一つ作成しておく![スクリーンショット 2021-12-15 20.15.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/fc347a1c-d547-1d16-527e-3c057f2d74fe.png)

- PHP 8.0.8
- PHP-FPM 8.0.8
- nginx 1.20
- DB管理ツール：adminer
- ルートディレクトリ：/usr/share/nginx/html/test

#流れ
1. EC2の初期設定
1. EC2にPHPとnginxをインストール
1. nginx.confの設定変更
1. php-fpmの設定変更
1. DB管理ツールadminer導入
1. wordpress管理画面のサイトヘルスに致命的な問題の対応
1. SSL化

#EC2の初期設定
##EC2ポートの変更
EC2を起動時、セキュリティーの観点から、sshポートを変更します。(やらなくても可)



```
$ sudo vim /etc/ssh/sshd_config

Port 49923
```
設定を反映します。セキュリティーグループの変更を忘れずに。
セキュリティーグループのタイプは`SSH`ではなく`カスタム TCP`です。

```
$ sudo service sshd reload
```

##日本時間の設定
下記記事参照

https://qiita.com/ganessa/items/9d6395237863810bab81

#EC2にPHPとnginxをインストール
`amazon-linux-extras`コマンドで、PHPとnginxのインストール可能なバージョンを確認します

```
$ sudo yum -y update

$ amazon-linux-extras

 15  php7.2                   available
 31  php7.3                   available
 38  nginx1                   available
 42  php7.4                   available
 51  php8.0                   available
```
`nginx1`と`php8.0`をインストールし、バージョンを確認します。

```
$ sudo amazon-linux-extras install -y nginx1

$ sudo amazon-linux-extras install -y php8.0

$ nginx -v
nginx version: nginx/1.20.0

$ php -v
PHP 8.0.8 (cli) (built: Jul  7 2021 17:35:32)

$ php-fpm -v
PHP 8.0.8 (fpm-fcgi) (built: Jul  7 2021 17:37:26)
```

nginxとPHP-FPMを起動、自動起動設定します。

```
$ sudo systemctl start nginx
$ sudo systemctl enable nginx

$ sudo systemctl start php-fpm
$ sudo systemctl enable php-fpm
```

#nginx.confの設定変更
`/etc/nginx/`配下に、`nginx.conf`があることが多いです。

```
$ sudo vim /etc/nginx/nginx.conf
```
/etc/nginx/nginx.confの初期設定

```conf:/etc/nginx/nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}
```
`server`内を変更します。
`root`と`server_name`、`try_files`、`error_page 404`の4箇所になります。

```conf:/etc/nginx/nginx.conf
    server {
        listen       80;
        listen       [::]:80;
        # ドメインがある場合は、_の箇所に記載する
        server_name  _;

        root         /usr/share/nginx/html/test;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

　　　　　　　　　　　　　　　　location / {
             try_files $uri $uri/ /index.php?q=$uri&$args;
        }


        error_page 404 = @notfound;
        location @notfound {
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root/index.php;
        fastcgi_param  QUERY_STRING     error=404;
        fastcgi_pass   php-fpm;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
```

###error_page 404
`error_page 404`について、`wp-content/theme/テーマディレクトリ/`配下に`404.php`ファイルがあるのですが、上記の設定をしないと反映されませんでした。

https://gist.github.com/pandanote-info/880db164b584cdb37629a4053ea88376

###try_files
`try_files`がないと、Laravelにパラメータが渡されず、laravelのトップは表示できますが、その他が表示できないため、注意してください

`try_files`は、全てのアクセスに対しての処理します。左からドキュメントルート配下を参照し、以下の場合は3つのステップを踏んでいます。


1. `$url` にファイルがあるか？
2. `$url/`（/で終わるファイルパスなので、要はディレクトリ）にディレクトリがあるか？見つかったらその中の indexを参照します
3. 上の二つがない場合、`/index.php?$query_string` へ内部リダイレクトする。（index.phpのファイル）


参考として、Laravel 公式ドキュメントにも Nginx の設定ファイルの例があります。
↓

https://laravel.com/docs/6.x/deployment

特に、他の変更はありませんでした。

他の記事だと、以下の記載を`nginx.conf`内でしていることがよくありますが、今回はしなくても問題ありません。

```conf
location ~ \.(php|phar)(/.*)?$ {
    fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;

    fastcgi_intercept_errors on;
    fastcgi_index  index.php;
    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO $fastcgi_path_info;
    fastcgi_pass   php-fpm;
}
```


理由は、`nginx.conf`内に以下の記載があるためです。

```conf:/etc/nginx/nginx.conf
http {
    include /etc/nginx/conf.d/*.conf;

    server {
        include /etc/nginx/default.d/*.conf;
```
`nginx.conf`には、`/etc/nginx/conf.d/*.conf`と`/etc/nginx/default.d/*.conf`ファイルが読み込まれていることが分かります。
読み込まれている2つのconfファイルを見ていきましょう。

###/etc/nginx/conf.d/*.conf

```
$ ls /etc/nginx/conf.d/
php-fpm.conf
```
今回は、`php-fpm.conf`が読み込み対象でしたので、見てましょう。

```conf:/etc/nginx/conf.d/php-fpm.conf
# PHP-FPM FastCGI server
# network or unix domain socket configuration

upstream php-fpm {
        server unix:/run/php-fpm/www.sock;
}
```

`unix:/run/php-fpm/www.sock;`が読み込まれていましたので、nginx.confとphp-fpmも同様な設定になっているか確認する必要があります。
`www.sock`は、php-fpmが再起動すると、作られます。

`/etc/nginx/default.d/*.conf`も確認しましょう。

###/etc/nginx/default.d/*.conf

```
$ ls /etc/nginx/default.d
php.conf
```
今回は、`php.conf`が読み込み対象でしたので、見てましょう。

```conf:/etc/nginx/default.d/php.conf
# pass the PHP scripts to FastCGI server
#
# See conf.d/php-fpm.conf for socket configuration
#
index index.php index.html index.htm;

location ~ \.(php|phar)(/.*)?$ {
    fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;

    fastcgi_intercept_errors on;
    fastcgi_index  index.php;
    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO $fastcgi_path_info;
    fastcgi_pass   php-fpm;
}
```
このファイルを読み込むことで、nginx.confファイルに記載する必要がないことが分かりました！
ちなみに、`$document_root`は、nginx.confで設定した`root`になります。

#php-fpmの設定変更
php-fpmの設定変更は、`/etc/php-fpm.d/www.conf`あると思います。

```conf:/etc/php-fpm.d/www.conf
+ user = nginx
-  user = apache
+ group = nginx
-  group = apache

#↓変更しません！
listen = /run/php-fpm/www.sock

+ listen.owner = nginx
+ listen.group = nginx
+ listen.mode = 0660

- ;listen.owner = nobody
- ;listen.group = nobody
- ;listen.mode = 0660
```
先程、`/etc/nginx/conf.d/php-fpm.conf`に`/run/php-fpm/www.sock`と記載されていましたので、このファイルも`/run/php-fpm/www.sock`としました。

#wordpressをダウンロード

```
$ cd /usr/share/nginx/html/
$ sudo wget https://ja.wordpress.org/latest-ja.tar.gz
$ sudo tar -xzvf latest-ja.tar.gz
$ sudo rm latest-ja.tar.gz
$ ls
wordpress

#ディレクトリ名をwordpressからtestに変更
$ sudo mv wordpress test

```


wp-config.phpを作成(コピー)します。

```
$ sudo cp test/wp-config-sample.php test/wp-config.php
```

権限を変更します

```
$ sudo chown -R nginx:ec2-user test/
$ sudo chown  -R nginx:ec2-user /var/log/nginx
$ sudo chown  -R nginx:ec2-user /var/log/php-fpm
$ sudo find test/ -type f -exec chmod 664 {} \;
$ sudo find test/ -type d -exec chmod 775 {} \;
$ sudo chmod 600 test/wp-config-sample.php 
$ sudo chmod 600 test/wp-config.php 
```
権限を`nginx:ec2-user`にした理由は、SFTP接続等をするためです。

詳細は、こちらで説明しています。

https://qiita.com/holdout0521/items/f4d81f27886b623c5ef0

また、`nginx`と`php-fpm`のlogファイルは、デフォルトだと`apache`となっており、logファイルに記入する権限がないため、権限を変更する必要があります。

```
$ ls /var/log
drwx------   2 apache  root               4096 12月 17 03:09 nginx
drwxrwx---   2 apache root                 268 11月 27 03:31 php-fpm
```


nginxを構文チェックし、nginxとphp-fpmを再起動します。

```
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

$ sudo systemctl restart nginx
$ sudo systemctl restart php-fpm
```

#wp-config.php修正
RDSの情報をwp-config.phpに記載します。
下記修正
ホスト名は、`RDSのエンドポイント`です。（auroraの場合ライターインスタンス）

```php:wp-config.php
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'database_name_here' );

/** MySQL データベースのユーザー名 */
define( 'DB_USER', 'username_here' );

/** MySQL データベースのパスワード */
define( 'DB_PASSWORD', 'password_here' );

/** MySQL のホスト名 */
define( 'DB_HOST', 'localhost' );
```

EC2のipアドレスでアクセスすると、wordpressが表示されました！
![スクリーンショット 2021-12-15 22.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/672c2d90-794d-1659-6348-65fff3a4b192.png)

#DB管理ツールadminer導入

こちらのリンクのURLをコピーし、`/usr/share/nginx/html/test`配下で、ダウンロードします。

https://www.adminer.org/#download

![スクリーンショット 2021-12-15 22.37.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/b002046e-12c9-d09f-7650-a8612fd8ad79.png)

```
$ cd  /usr/share/nginx/html/test/
$ sudo wget https://github.com/vrana/adminer/releases/download/v4.8.1/adminer-4.8.1.php

$ ls
adminer-4.8.1.php その他
```

アクセスしてみましょう。

![スクリーンショット 2021-12-15 22.43.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/8398c465-c591-8ea8-4ca0-74b48366e405.png)

adminerを使っているときに、`「不正なCSRFトークン。再送信してください」と表示される`というエラーが出ることがあります。sessionディレクトリの所有権にnginxが許可されていないことが原因のため、所有権を変えます。

```
$ cd /var/lib/php
$ ls -la
drwxrwx---  2 root apache    6  7月  7 17:41 session
```
所有権のグループがapacheのため、nginxに変えましょう。

```
$ cd /var/lib/php
$ chown -R root:nginx session
```

原因の詳細はこちら↓

https://note.mokeco.in/209/#CSRF


#wordpress管理画面のサイトヘルスに致命的な問題の対応
以下のエラー分があった場合、追加でインストールします。

```
1つ以上の必須モジュールが存在しません
PHP モジュールはサイトの稼働に必要なほとんどのタスクをサーバー上で実行します。変更はサーバー管理者が実施する必要があります。
- オプションのモジュール dom がインストールされていないか、無効化されています。
- オプションのモジュール mbstring がインストールされていないか、無効化されています。
- オプションのモジュール imagick がインストールされていないか、無効化されています。
- 必須モジュール gd がインストールされていないか、無効化されています。
```
![スクリーンショット 2021-12-15 22.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/b081a307-0e43-1a84-7b22-565586c6bbf8.png)

```
$ sudo yum install -y php php-dom
$ sudo yum install -y php php-mbstring
$ sudo yum install -y php php-imagick
$ sudo yum install -y php php-gd

$ sudo systemctl restart nginx
$ sudo systemctl restart php-fpm
```

#SSL化
HTTPS化する手順は、以下の記事が参考になります。

https://qiita.com/blackpeach7/items/5228f4c52e21c6922086

#参照

https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc

https://www.php.net/manual/ja/install.fpm.configuration.php