AWS 練習 : WordPress 構築 (amazonlinux, nginx, MariaDB)

AWS の EC2 上に WordPress を構築する。

# 環境

- amazon linux 2023
- nginx 1.24
- php 8.2
- MariaDB 10.6.14 (RDS)

データベースについては、EC2 にインストールしても RDS で作成してもやることは同じだった。
単純に WordPress 構築だけを目指すなら Apache + MySQL の方が簡単らしい。

# Webサーバーの構築

WordPress のルートディレクトリを作成し、nginx + php-fpm で web サーバーを構築する。

## WordPress のソースファイルを配置

公式からソースファイルをダウンロードして任意の場所に展開。
今回はルートディレクトリを "/var/www/wordpress" とした。

```shell
cd /var/www
sudo curl -O https://ja.wordpress.org/latest-ja.tar.gz
sudo tar xzf latest-ja.tar.gz
sudo rm lsatest-ja.tar.gz
```

## パッケージをインストール

- nginx
- php
- php8.2-mysqlnd
- php8.2-gd

```shell:インストールコマンド
sudo dnf install <パッケージ名>
```
nginx で PHP を動かすには php-fpm が必要だが、パッケージ名 php でインストールすると php8.2-fpm も一緒にインストールされた。
ただし、このパッケージには mysqlnd と gd が含まれないため、この２つは別途インストールが必要。

## nginx と php-fpm の連携

### nginx の設定

"~.php" でのアクセスを nginx から php-fpm に投げるように設定ファイルを変更する。
nginx の設定ファイルの構文では、設定項目をディレクティブ、その適用範囲をグループ化する構造をブロックと呼び、デフォルトの設定ファイルには、http > server > location というブロックの階層構造が定義されている。
この中の server ブロックに WordPress のルートディレクトリと php へのアクセス処理を追加する。

```nginx:/etc/nginx/nginx.conf
server {

    listen       80;
    listen       [::]:80;
    server_name  _;  # サーバーの名前
    root         /var/www/wordpress;  # 変更: WordPress のソースファイルを置く場所に変更
    index        index.php index.html index.htm;  # 変更: index.php を追加

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

    # この location ブロックを追加
    location ~ \.php$ {
            fastcgi_pass    unix:/run/php-fpm/www.sock;
            fastcgi_index   index.php;
            fastcgi_param   SCRIPT_FILENAME /var/www/wordpress$fastcgi_script_name;
            include         fastcgi_params;
    }

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

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

root や index ディレクティブは location ブロックに書いてる例もあったが、サブサイトみたいな構成にしない限り影響なさそう。
ちなみに、この設定だと https に対応していないため、アドレスバーに URL を貼り付けてアクセスする場合は http://~ に修正すること。
https 対応の手順は別記事を参照。

### php-fpm の設定

デフォルトではプロセスの実行ユーザーが "apache" となっているため、これを　”nginx” ユーザーに変更する。

```conf:/etc/php-fpm.d/www.conf
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used. 
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx  # 変更
; RPM: Keep a group allowed to write in log dir.
group = nginx  # 変更
``` 

### 動作確認

次のファイルを作成し、web サーバーを起動してブラウザでアクセスする。

```php:/var/www/wordpress/test.php
<?php phpinfo();
```
```shell:nginx の起動
sudo service start nginx
```

# WordPress のインストール

公式のインストール方法に従って、"wp-config.php" に MariaDB への接続情報を記載し、ブラウザで "/wp-admin/install.php" へアクセスするだけ。
ここでインストール画面が表示されない場合は "wp-config.php" の接続情報と、php 関係のパッケージのインストール状態を確認。

_php-mysqlnd_
これがないと "mysqli_connect()" 関数が見つからず WordPress の php スクリプトが止まる。
しかもブラウザ側は 404 で表示され、エラー内容がわからないため、最初にこれでつまづいた。

_php-gd_
これがなくても WordPress のインストールは完了できるが、WordPress 上での画像編集ができない。
このエラーについては、WordPress 管理画面のサイトヘルスで"重大なエラー"として表示されるので気づきやすい。

## WordPress の FTP 接続

インストール完了後に、テーマを追加しようとしたら「FTP の接続情報を入力してください」というダイアログが表示され、テーマのインストールができなかった。
この原因は、WordPress が web サーバーとのファイルのやり取りに FTP (SFTP) を使って動いているためで、これは web サーバーとサイトの管理者が異なる場合でも、サーバーのファイル操作ができるようにするための仕様とのこと。
しかし、今回の構成ではサーバーもサイトも同じ管理者なので、FTP を使う必要がなく、このために FTP サーバーを稼働させてパスワード管理するのも面倒なので、他の人を参考にして、FTP なしで動作するよう設定を変更した。

### FTP 接続の無効化設定

準備として、ルートディレクトリ以下の所有者を変更し、nginx ユーザーでファイルの作成と削除ができるようにする。

```shell
sudo chwon -R nginx:ec2-user /var/www/wordpress
```

WordPress の設定ファイルに FTP を使用しない設定を追加する。
```php:/var/www/wordpress/wp-config.php
/* Add any custom values between this line and the "stop editing" line. */

/* That's all, stop editing! Happy publishing. */

define( 'FS_METHOD', 'direct' );  # この１行を追加

/* Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
        define( 'ABSPATH', __DIR__ . '/' );
}
```

以上で完了、無事にテーマやプラグインの追加もできるようになった。