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

Buffalo WZR-HP-AG300H
CPU: 680MHz; ROM: 32MB; RAM: 128MBa
OpenWrt
19.07.3
HTTPd
NGINX (with SSL) 1.17.7
PHP
7.2.31 (FPM)
SQLite
php7-mod-pdo-sqlite 3.31.1
Drupal
8.9.3(最新は 9.0 だが、OpenWrt の最新の 19.07 では PHP 9.2 のため、要件にギリギリ届かない)

USB フラッシュドライブ、NGINX + PHP (FPM) のセットアップ

WordPress のインストール(👉 WordPress を低スペック OpenWrt ルーターにインストール)で行った作業に準ずるものとする。

SQLite のセットアップ

👉 core/INSTALL.sqlite.txt

単独の SQLite は不要。PHP の SQLite 関連モジュールだけで良い。


opkg update
opkg install php7-mod-pdo-sqlite

ファイルの置き場には、インストール過程でデフォルトとして示される ./sites/default/files/.ht.sqlite をそのまま使うものとする。留意しなければならないのは、デフォルトのパスを使うにせよ、フォルダーとファイル自身が書き込み可にパーミッションを変更しておかなければならない点である。このパーミッション変更を忘れていると、インストール自体が無事終ってから、最初にサイトの画面を表示する段階でデータベースエラーが発生する。

特に、インストーラーが自前で作成する .ht.sqlite までもがパーミッション変更が必要なことに気付くまで、当初はエラーの原因がわからずに悩む羽目になった。インストーラーが自分で作成できるのだから、こちらでパーミッションを変更せずとも、どうとでもなるんじゃないかと思うのだが、インストーラーと、インストール後の Drupal 本体では、セキュリティ的に権限が違っているからだろう。

PHP の調整

PHP 側の処理が重く時間がかかり過ぎると、NGINX が 504 Gateway Time-out にする場合があるので、関連する時間制限の設定を一律 10 分(600 秒)に拡大した。

/etc/php.ini

- max_execution_time = 300
+ max_execution_time = 600
- max_input_time = 60
+ max_input_time = 600
/etc/nginx/nginx.conf

+       # next 4-line is for 504 Gateway Timeout error
+       proxy_connect_timeout 600;
+       proxy_send_timeout 600;
+       proxy_read_timeout 600;
+       send_timeout 600;
+
        location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
/etc/nginx/conf.d/php.locations

+   fastcgi_read_timeout 600;
}

オーソドックスな手動インストール

👉 core/INSTALL.txt に必要十分な情報が載っている。

ダウンロード・解凍した Drupal のファイル群を、Drupal 用の Web ルート(ここでは /mnt/data/www/drupal を mkdir して用意して使用)に移動する。


cd /mnt/data
wget https://ftp.drupal.org/files/projects/drupal-8.9.3.tar.gz
tar -xvzf drupal-8.9.3.tar.gz
cd drupal-8.9.3
mkdir /mnt/data/www/drupal
mv * .htaccess .csslintrc .editorconfig .eslintignore .eslintrc.json .gitattributes /mnt/data/www/drupal

さらに、INSTALL.txt に明記してあるように、./sites/default のパーミッションを変更。./sites/default/files を作成の上・パーミッションを変更。./sites/default/default.settings.php から ./sites/default/settings.php をコピーの上、パーミッションを変更。


cd /mnt/data/www/drupal
chmod a+w ./sites/default
mkdir ./sites/default/files
chmod a+w ./sites/default/files
cp ./sites/default/default.settings.php ./sites/default/settings.php
chmod a+w ./sites/default/settings.php

さらに、データベースファイル .ht.sqlite を空の状態で予め作成しておいて、先にパーミッションを適切に変更しておく。


touch ./sites/default/files/.ht.sqlite
chmod a+w ./sites/default/files/.ht.sqlite

ブラウザから https://(該当アドレス)/ にアクセスすることでインストール開始する。

エラー 1:TimeZone

Fatal error: DateTime::createFromFormat(): Timezone database is corrupt - this should *never* happen! in /mnt/data/www/drupal/vendor/symfony/http-foundation/ResponseHeaderBag.php on line 339

これは TimeZone 関係のエラーらしい。だが、/etc/php.ini に date.timezone = "Asia/Tokyo" を追加しても解決されず。実はこれに関しては OpenWrt 固有のもので、ROM の使用容量を極力切り詰めるために TimeZone の設定ファイルすらデフォルトではインストールされていない。なので、パッケージ(zoneinfo-asia)をインストールすれば問題はなくなる。特に php.ini の記述に date.timezone = を追加するような必要もない。


opkg install zoneinfo-asia
エラー 2:メモリー

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 32768 bytes) in /mnt/data/www/drupal/core/lib/Drupal/Core/Menu/LocalTaskManager.php on line 427

PHP のメモリー制限が小さ過ぎたので、128M(64M では足りなかった)に拡大した。/etc/php.ini の該当個所を変更(して service php7-fpm reload)する:


-memory_limit 8M
+memory_limit 128M
エラー 3:必須のPHP 拡張モジュール
  • php7-mod-dom
  • php7-mod-gd
  • php7-mod-hash
  • php7-mod-json
  • php7-mod-session
  • php7-mod-simplexml
  • php7-mod-tokenizer
  • php7-mod-xml

必須なので、上記すべてを opkg install の上、再起動(service php7-fpm reload)。

👉 PHP extensions needed で述べられているように core/composer.json の require ブロック中の ext-*** が該当する。OpenWrt の場合は上記リストのものを opkg インストールすることで、これらが全て揃う(<?php phpinfo()?> なりで確認できる)。

警告 1:推奨のPHP 拡張モジュール

php7-mod-opcache と php7-mod-mbstring もインストールを推奨されるので、これらも opkg install する。

警告 2:LIMITED DATE RANGE

Buffalo WZR-HP-AG300H が 32-bit CPU なのはどうしようもないので、この警告は無視する。

Web インストーラーの実行

ブラウザーから https://(該当アドレス)/ にアクセスして順調にインストールが進むと以下のようになる:

Choose language: English
Choose profile: Standard
Verify requirements
Set up database: SQLite
Install site
Configure site

指示されているように、./sites/default/settings.php と ./sites/default のパーミッションを元に戻す(ただし ./sites/default/files や .ht.sqlite は戻さずにそのままにしておく)。


cd /mnt/data/www/drupal
chmod go-w ./sites/default/settings.php
chmod go-w ./sites/default
インストール成功直後(管理画面に移行)

30 分程度でインストールできた。

また何度かインストール作業を繰り返す中で、インストールが終わった直後の最初に web ルートの管理画面にリダイレクトする段階で、何やらエラーが出て、にっちもさっちもいかなくなることも多発した。様々な解決方法を模索した結果、結局この場合は、/update.php を実行してデータベースをアップデートすれば解消されるエラーだということがわかった。

The website encountered an unexpected error. Please try again later.

InvalidArgumentException: Class "Drupal\views\Routing\ViewPageController" does not exist. in Drupal\Core\DependencyInjection\ClassResolver->getInstanceFromDefinition() (line 24 of core/lib/Drupal/Core/DependencyInjection/ClassResolver.php).
Drupal\Core\Controller\ControllerResolver->createController('Drupal\views\Routing\ViewPageController::handle') (Line: 72)
Drupal\Core\Controller\ControllerResolver->getControllerFromDefinition('Drupal\views\Routing\ViewPageController::handle', '/') (Line: 88)
Drupal\Core\Controller\ControllerResolver->getController(Object) (Line: 134)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 68)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 57)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 47)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 47)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 52)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 708)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)

ページ下端の try again で進む。

Continue し、

Front or Administration pages に進んで改めてサイトにリダクレクトされる。

インストール完了

やった方がいい調整

./sites/default/settings.php

+ $config['system.logging']['error_level'] = 'verbose';

* will allow the site to run off of all variants of example.com and
* example.org, with all subdomains included.
*/
+ $settings['trusted_host_patterns'] = [
+   '^scaredeer\.com$',
+   '^www\.scaredeer\.com$',
+ ];

最後に

OpenWrt の公式ガイドではかろうじて WordPress のインストール事例が掲載されているだけだし、しかもやや古く、Web サーバーは NGINX ではなくて従来の uHTTP を前提としている。それをさらに WordPress ではなく Drupal の話ともなると、英語の情報を含めて広く検索したが、「OpenWrt で Drupal をインストールした」事例など一つとして見付けられなかった。

先日、WordPress の構築を試みた(👉 WordPress を低スペック OpenWrt ルーターにインストール)時にも、本当は(低スペック OpenWrt ルーターにとっては重い)MySQL/MariaDB ではなく、SQLite を使いたかったののだが、公式対応されていないことから断念した。一方、Drupal は SQLite に公式に対応しているので、元々 WordPress よりもコードが洗練されていてずっと高速であると評判の Drupal だが、SQLite のお陰でなおさら(WordPress 比の体感で)爆速である。WordPress にせよ、Drupal にせよ、そもそもこれまで CMS 自体何一つ使ったことがなかったので、まずは目論見通り低スペック OpenWrt でそもそも使えるようになるのかということも含めて未確定な状況からのスタートだったが、いずれにせよ安定してインストールできる方法論が確立できたので、そうなってから振り返ってみると、これはもう立て続けに両方インストールをしてみたからハッキリわかるのだが、WordPress よりもずっと Drupal の方が合理的で洗練されているのが見え見えで、今後 Drupal 以外に選択の余地はないと思う。

ちなみに試行錯誤の過程で、MariaDB ベースでのインストールも試みたが、重い上に、メモリーが足りなかったのか、上手く行かなかった。SQLite での構築が上手く行ったので、これで、重くメモリーを圧迫している MySQLd(MariaDB)の方はアンインストールしてしまえる。

今回の記事では、インストールの方法論の確立が主眼なので、インストールが無事に成功したここまでで一旦記事を終えることにするが、実際の運用上は、まだ必要な調整が残っている。NGINX の設定を実際の運用に合わせてもう少し細かく調整するべきである(👉 NGINX を Drupal 用に設定する)し、他にマルチドメイン運用についても一通り確立したら記事にすると思う。


備考:Composer のインストールは失敗

PHP のモジュール管理用ツール Composer を使うのが定番のようなので、セットアップしようとしたが、上手くいかず、結局は断念して、オーソドックスに手動でインストールすることにした。


Do not run Composer as root/super user! See https://getcomposer.org/root for details
Checking platform settings: OK
Checking git settings: OK
Checking http connectivity to packagist: OK
Checking https connectivity to packagist: OK
Checking github.com rate limit: FAIL
[Composer\Downloader\TransportException] The "https://api.github.com/rate_limit" file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages:
error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
Failed to enable crypto
failed to open stream: operation failed
Checking disk free space: OK
Checking pubkeys: FAIL
Missing pubkey for tags verification
Missing pubkey for dev verification
Run composer self-update --update-keys to set them up
Checking composer version: OK
Composer version: 1.10.10
PHP version: 7.2.31
PHP binary path: /usr/bin/php-cli
OpenSSL version: OpenSSL 1.1.1g  21 Apr 2020

Composer が処理の過程で GitHub からダウンロードしようとするのだが、TLS 1.0 を使おうとし、GitHub 側は 1.2 以上でないと受け付けないのでエラーが出る。OpenSSL 自体のバージョンは十分に新しいのだが、Composer が TLS 1.2 を使うように決め打ちする方法がわからず、断念。Composer の利用は諦めて、一旦、ここまでの作業を opkg remove 等してすべてキャンセルし、巻き戻した。

おそらく、根に同じ原因が絡んでいるが、要するにこの OpenWrt ルーターでは GitHub へのアクセスに問題があるので、インストール過程で日本語を選ぶこともできなかった(インストーラーが自動で GitHub からローカライゼーションファイルを取得する流れとなるため)。

コメント

このブログの人気の投稿

EP-805A 廃インク吸収パッド交換

m3u8 ファイルをダウンロードして ffmpeg で MP4 に変換・結合

WZR-HP-AG300H with OpenWrt