WordPress を低スペック OpenWrt ルーターにインストール

Buffalo WZR-HP-AG300H に OpenWrt をセットアップし、WordPress をインストールしてみる。

Buffalo WZR-HP-AG300H
CPU: 680MHz; ROM: 32MB; RAM: 128MB
OpenWrt
19.07.3
HTTPd
NGINX (with SSL) 1.17.7
PHP
7.2.31 (FPM)
MySQL
MariaDB 10.2
WordPress
5.4.2

USB フラッシュドライブ

今回は 8GB のフラッシュドライブを使った。256MB を swap 用に割り当て、残りをデータ用(/mnt/data)に使い、続く作業で nginx の Web ルート、MariaDB のインストール場所として割り当てるために利用する。

👉 OpenWrt での USB フラッシュドライブ

Web サーバーの NGINX 化と、PHP 7(FPM)との連携

WordPress をインストールする前提として、Web サーバーを通じて PHP 7 が使える環境を整えておく必要がある。ここでは Web サーバー(HTTPd)としてNGINX(SSL 対応版)を使い、PHP は FPM で NGINX と連携させた。

👉 OpenWrt で NGINX と PHP 7(FPM)環境を整える

MariaDB のインストール

本当は SQLite3 にしたかったが、WordPress の SQLite 用プラグイン(sqlite-integration)が開発が停止したままとなっていて将来性が不透明なため、素直に MySQL 互換の MariaDB を使うことにする(MariaDB にするとサイズ的に 6.6MB と比較的大きいので、可能であれば避けたかったが)。

MariaDB を適切にセットアップ(👉 OpenWrt で MariaDB を使えるようにする)した後、例えば、データベース名:wordpress;ユーザー名:wordpress;パスワード:******** で WordPress 用のデータベースを用意する。そのためには下のようにする(👉 WordPress 公式)。


CREATE DATABASE wordpress;
GRANT ALL PRIVILEGES ON wordpress.* TO "wordpress"@"localhost" IDENTIFIED BY "********";
FLUSH PRIVILEGES;
EXIT

下のスクリーンショットのような感じで MariaDB クライアントから、wordpress アカウントで wordpress データベースにパスワード ******** でアクセスしてみれば、ちゃんとデータベースが作成できているかどうか確かめることができる。

PHP で MySQL(MariaDB)を利用するための拡張モジュールのインストール

ここまでの作業で PHP と MySQL(MariaDB)について、それぞれ個別のセットアップは済んでいるのだが、WordPress は直接 MySQL を操作できるわけではなく、あくまでも PHP プログラムとして MySQL データベースを利用するので、このままではまだ PHP が MySQL を利用できるようにはなっておらず、もし WordPress をインストールしたとしても次のようなエラーが発生する。

Requirements Not Met

Warning: Use of undefined constant WP_CONTENT_DIR - assumed 'WP_CONTENT_DIR' (this will throw an Error in a future version of PHP) in /mnt/data/www/default/wp-includes/load.php on line 141

Your PHP installation appears to be missing the MySQL extension which is required by WordPress.

なので、PHP 用の MySQL インターフェース拡張モジュール(php7-mod-mysqli)をインストールしておく:


opkg install php7-mod-mysqli

以上まででやっと WordPress をインストールするためのお膳立てが終りで、ここからようやく WordPress 自体のインストール作業に入ることができる。

WordPress のインストール

WordPress 自体のインストールは非常に単純で、基本的にはディレクトリ丸ごとファイル群をコピーするだけ。コンパイルやインストーラーによる処理は不要。PHP の SSI プログラムによって構成された Web サイトのデータクラスターに過ぎないわけなので、その辺は超単純。

唯一する調整作業は MariaDB で用意したデータベースのデータベース名・アカウント名・パスワード名を wp-config.php に反映させて記述することのみ。

  1. 自分の PC にでも、公式からダウンロードして解凍する(wordpress フォルダが得られる)。
  2. wp-config-sample.php のデータベース名・アカウント名・パスワード名・ホスト名を修正の上、ファイル名を変更して wp-config.php にする。
  3. wordpress フォルダーの中身を、(PC から)ルーターの適切な場所(今回の例では /mnt/data/www/default)に(scp などで)コピーする。
wp-config-sample.php → wp-config.php

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
-define( 'DB_NAME', 'database_name_here' );
+define( 'DB_NAME', 'wordpress' );

/** MySQL database username */
-define( 'DB_USER', 'username_here' );
+define( 'DB_USER', 'wordpress' );

/** MySQL database password */
-define( 'DB_PASSWORD', 'password_here' );
+define( 'DB_PASSWORD', '********' );

/** MySQL hostname */
-define( 'DB_HOST', 'localhost' );
+define( 'DB_HOST', '127.0.0.1' );

※ IP アドレス 127.0.0.1 は localhost のことで、データベースの作成時コマンド内でも localhost という表現の方を使ったわけだが、それでもその作成したデータベースにクライアントからのログイン時には 127.0.0.1 でないと失敗する。そのため、この WordPress の設定でも、127.0.0.1 としないと次のようなエラーが出てデータベースへのログインに失敗する:

Error establishing a database connection

This either means that the username and password information in your wp-config.php file is incorrect or we can’t contact the database server at localhost. This could mean your host’s database server is down.
PC からのコピー

scp -r ~/Downloads/wordpress/* root@192.168.1.1:/mnt/data/www/default

今回の例では、前述の NGINX のセットアップの作業によって、ルーターにアクセスすると LuCI が表示されるような状態になっており、そのデフォルト用の Web サイトのルートは /mnt/data/default となっている。この場合、既存のファイル群は ./cgi-bin と ./luci-static に存在し、さらに ./index.html がそこにリダイレクトする構成となっている。/mnt/data/default に wordpress のファイル群をコピーすると、./cgi-bin と./luci-static と ./index.html 以外はすべて wordpress 由来のファイルになるので(wordpress のファイル群は、既存のものとは重複しない)、そこはあとで wordpress をアンインストールしたくなった場合などのために留意しておけばよい。

PHP 用の拡張モジュールの追加

実は厳密には、上までのインストールでは、まだエラーが発生して WordPress を正常に起動することができない。https://192.168.1.1/wp-admin/ を開こうとすると https://192.168.1.1/wp-admin/install.php を実行している段階で次のようなエラー表示となる:

There has been a critical error on your website.

Learn more about debugging in WordPress.

これは、php7-mod-json さえ追加でインストールすれば解消できる。


opkg install php7-mod-json

※再起動しないと php7-mod-json の追加が反映されない点には留意する。

他にもいくつかの PHP 用の拡張モジュールが必要とされる場合があるようである。

今はとりあえず php7-mod-json の追加だけ行い、管理画面の Welcome 画面の表示までこぎつけることができた。

https://192.168.1.1/wp-admin/ → https://192.168.1.1/wp-admin/install.php


今後の課題

以上で、確実に OpenWrt で WordPress がインストールでき、動くところまで到達できることがわかった。

しかし、推奨されている PHP 用の拡張モジュールのインストールを無闇に行わず、最低限(mysqli と json のみ)に絞っているので、今後実際に運用していく中で何らかの支障が生じてくることも考えられる(その場合はこの記事をアップデートする予定である)。また、直接、支障がなくとも、パフォーマンス的に影響する場合も考えられる。例えば現状では多少処理が重いが、opcache を入れれば、おそらく前半のバイドコード化の部分がキャッシュされる影響で遅延時間が半減するはずである。そういったことも、おいおい行って(記事にして)行こうと思うが、今回の記事では、(OpenWrt 公式を含めて巷間には、uHTTPd だったり通常の FastCGI だったりと、少々古い情報が多く)前例がなかったので、まずはより先鋭的な NGINX + PHP7-FPM の構成で、必要最小限となる条件を見出しながらセットアップ方法を確立することに焦点を当ててみた。

せっかく試行錯誤の末に WordPress のインストール方法論が確立できたのだが、インストール過程で何となくブラックボックス化されていて、ただ丸ごとファイル群をコピーするだけというのに何となく不安を感じていたので、モジュール面での開発態勢の透明性が高い Drupal に非常に興味が湧き、一旦 WordPress のインストールを白紙化して、Drupal のインストールで再試行してみることにした。結果、成功し、CMS は WordPress ではなく Drupal で落ち着いた(👉 Drupal を低スペック OpenWrt ルーターにインストール)。

コメント

このブログの人気の投稿

OpenWrt での Wi-Fi 設定

シークエンスパパとも 本物の霊能力

シークエンスパパともの先見の明