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" とした。
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
sudo dnf install <パッケージ名>
nginx で PHP を動かすには php-fpm が必要だが、パッケージ名 php でインストールすると php8.2-fpm も一緒にインストールされた。
ただし、このパッケージには mysqlnd と gd が含まれないため、この2つは別途インストールが必要。
nginx と php-fpm の連携
nginx の設定
"~.php" でのアクセスを nginx から php-fpm に投げるように設定ファイルを変更する。
nginx の設定ファイルの構文では、設定項目をディレクティブ、その適用範囲をグループ化する構造をブロックと呼び、デフォルトの設定ファイルには、http > server > location というブロックの階層構造が定義されている。
この中の server ブロックに WordPress のルートディレクトリと php へのアクセス処理を追加する。
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” ユーザーに変更する。
; 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 phpinfo();
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 ユーザーでファイルの作成と削除ができるようにする。
sudo chwon -R nginx:ec2-user /var/www/wordpress
WordPress の設定ファイルに FTP を使用しない設定を追加する。
/* Add any custom values between this line and the "stop editing" line. */
/* That's all, stop editing! Happy publishing. */
define( 'FS_METHOD', 'direct' ); # この1行を追加
/* Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
以上で完了、無事にテーマやプラグインの追加もできるようになった。