AWS EC2上のRHEL8にWordpress環境をインストールする


数年前にLAMPの勉強でAmazon Linux(2だったかな?)上でWordpressを作ったことがあるのですが、今回改めてRHEL8上で構築してみましたので、記録として残しておきます。

  • バージョンとか
    • Red Hat Enterprise Linux 8.3 (Ootpa)
    • Apache/2.4.37 (Red Hat Enterprise Linux)
    • mysql Ver 8.0.21 for Linux on x86_64 (Source distribution)
    • PHP 7.2.24
    • Wordpressのバージョン:5.7.1

①必要なパッケージ(Apache、MySQL、PHP)のインストール

EC2にSSHで初めてアクセスした状態からスタート。以降全部管理者権限で実施するため、最初にrootに昇格する。
Apache、PHPなどのパッケージをインストールするために、まずはリポジトリを追加。
(次のパッケージインストールが普通にできるなら、不要かも)

sudo su -
yum -y localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-8.rpm

リポジトリ追加後にもろもろパッケージをインストールする。
wgetは後でWordpressを入手するときに使う。

yum -y install httpd mysql-server wget
yum -y install php php-mysqlnd php-mbstring php-pecl-zip php-json php-pear php-gd

②mysqlの設定

文字コードを設定した上で、Wordpress用のユーザとデータベースを用意する。
まずはmy.cnfに設定を追加。

vi /etc/my.cnf

my.cnfに追記する内容は以下。パスワード周りを簡略化するために文字コード以外の設定も追加。
※文字コードはClient側も今までは設定していたが、最近それがあると日本語入力をmysqlが受け付けなくなるようなので省略。

my.cnfに追記する内容
validate_password.policy=LOW
validate_password.check_user_name=OFF
validate_password.length=4
validate_password.mixed_case_count=0
validate_password.number_count=0
validate_password.special_char_count=0
character_set_server=utf8mb4

[client]
#今まではこれを追加していたが、コメントしないと日本語入力を受け付けないっぽい
#default-character-set=utf8mb4

mysqlにログインしてユーザ追加&データベース作成。

systemctl start mysqld
mysql -uroot -p
mysql
CREATE USER 'wpuser'@'%' IDENTIFIED BY 'wpuser';
GRANT ALL PRIVILEGES ON *.* TO 'wpuser'@'%' WITH GRANT OPTION;
CREATE DATABASE wp1;
SELECT user,host FROM mysql.user;
SHOW DATABASES;
EXIT

③Wordpressのインストール

Wordpressを入手し、権限周りを設定した後にインストールを進める。

wget http://ja.wordpress.org/latest-ja.tar.gz ~/
tar zxvf ~/latest-ja.tar.gz
mkdir /var/www/html/wp
cp -r ~/wordpress/* /var/www/html/wp
chown apache:apache -R /var/www/html/wp
systemctl start httpd

この後wp-config.phpを作成するが、今回はinstall.phpを使う方法を実施。
手動でwpディレクトリ直下にあるwp-config-sample.phpをwp-config.phpにリネームして設定を書き込んでいくことも可能。

http://【EC2のURL】/wp/wp-admin/install.phpにアクセス

mysqlで作成したデータベース名、ユーザ名を入力

下記のような文言が出たら、wpディレクトリ直下にwp-config.phpを作成して全文コピペ

vi /var/www/html/wp/wp-config.php
wp-config.php(認証用ユニークキーは一応隠しました)
<?php
/**
 * WordPress の基本設定
 *
 * このファイルは、インストール時に wp-config.php 作成ウィザードが利用します。
 * ウィザードを介さずにこのファイルを "wp-config.php" という名前でコピーして
 * 直接編集して値を入力してもかまいません。
 *
 * このファイルは、以下の設定を含みます。
 *
 * * MySQL 設定
 * * 秘密鍵
 * * データベーステーブル接頭辞
 * * ABSPATH
 *
 * @link https://ja.wordpress.org/support/article/editing-wp-config-php/
 *
 * @package WordPress
 */

// 注意:
// Windows の "メモ帳" でこのファイルを編集しないでください !
// 問題なく使えるテキストエディタ
// (http://wpdocs.osdn.jp/%E7%94%A8%E8%AA%9E%E9%9B%86#.E3.83.86.E3.82.AD.E3.82.B9.E3.83.88.E3.82.A8.E3.83.87.E3.82.A3.E3.82.BF 参照)
// を使用し、必ず UTF-8 の BOM なし (UTF-8N) で保存してください。

// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'wp1' );

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

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

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

/** データベースのテーブルを作成する際のデータベースの文字セット */
define( 'DB_CHARSET', 'utf8mb4' );

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define( 'DB_COLLATE', '' );

/**#@+
 * 認証用ユニークキー
 *
 * それぞれを異なるユニーク (一意) な文字列に変更してください。
 * {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org の秘密鍵サービス} で自動生成することもできます。
 * 後でいつでも変更して、既存のすべての cookie を無効にできます。これにより、すべてのユーザーを強制的に再ログインさせることになります。
 *
 * @since 2.6.0
 */
define( 'AUTH_KEY',         '7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa' );
define( 'SECURE_AUTH_KEY',  '=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2' );
define( 'LOGGED_IN_KEY',    '=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}' );
define( 'NONCE_KEY',        ',xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxP' );
define( 'AUTH_SALT',        'sxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ' );
define( 'SECURE_AUTH_SALT', 'Vxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7' );
define( 'LOGGED_IN_SALT',   'wxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxM' );
define( 'NONCE_SALT',       '2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8' );

/**#@-*/

/**
 * WordPress データベーステーブルの接頭辞
 *
 * それぞれにユニーク (一意) な接頭辞を与えることで一つのデータベースに複数の WordPress を
 * インストールすることができます。半角英数字と下線のみを使用してください。
 */
$table_prefix = 'wp_';

/**
 * 開発者へ: WordPress デバッグモード
 *
 * この値を true にすると、開発中に注意 (notice) を表示します。
 * テーマおよびプラグインの開発者には、その開発環境においてこの WP_DEBUG を使用することを強く推奨します。
 *
 * その他のデバッグに利用できる定数についてはドキュメンテーションをご覧ください。
 *
 * @link https://ja.wordpress.org/support/article/debugging-in-wordpress/
 */
define( 'WP_DEBUG', false );

/* 編集が必要なのはここまでです ! WordPress でのパブリッシングをお楽しみください。 */

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

/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';

wp-config.phpを作成後に「インストール実行」を押すと、下記画面が表示される。
Wordpress用のユーザ情報を入れる。
※勉強としてWordpressを入れるときとかは、一時的なメールアドレスを発行してくれるTemp Mailというサービスをよく使ってます。

設定が無事に終わったらログインボタンを押して・・・

先ほどのユーザー名&パスワードを設定したら・・・

無事に作成完了!

前にAmazon Linuxでやったときと恐らく同じ手順だが、Amazon Linuxと違ってリポジトリが入ってなかったりしたのでそのあたりは事前に追加が必要だった。(といいつつ、本当はRHEL8でもリポジトリ追加しないでデフォルトのまま、必要なパッケージをインストールできそうな気もしています。まあできたからヨシ!)

余談

最初、③のinstall.phpのところでエラー画面になって焦ったのだが、下記の通りログを追ったらphp-jsonをインストールできてないことに気づいた。
改めてインストールしたら無事解決。(権限の問題とか、htaacessの設定とかselinuxとか細かいところを最初ログを調べもせずに疑ってしまった・・・)
エラー画面の文言でググる前にログを確認しよう、という教訓です(当たり前か)。

ちなみに、こんな画面になりました。

ログ(/var/log/php-fpm/www-error.log)を確認すると、こんな感じでした。

/var/log/php-fpm/www-error.log
[05-May-2021 02:29:02 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function json_decode() in /var/www/html/wp/wp-includes/blocks.php:203
Stack trace:
#0 /var/www/html/wp/wp-includes/blocks/archives.php(115): register_block_type_from_metadata('/var/www/html/w...', Array)
#1 /var/www/html/wp/wp-includes/class-wp-hook.php(292): register_block_core_archives('')
#2 /var/www/html/wp/wp-includes/class-wp-hook.php(316): WP_Hook->apply_filters(NULL, Array)
#3 /var/www/html/wp/wp-includes/plugin.php(484): WP_Hook->do_action(Array)
#4 /var/www/html/wp/wp-settings.php(560): do_action('init')
#5 /var/www/html/wp/wp-admin/setup-config.php(33): require('/var/www/html/w...')
#6 {main}
  thrown in /var/www/html/wp/wp-includes/blocks.php on line 203