WordPressをインストールする際に現れる幾つかのエラーを対処する

OS: Red Hat Enterprise Linux Server release 7.8 (Maipo)
Apache 2.4.6 / mysql 8.0.19 / PHP 7.3.17
WordPress 5.4

WordPressについて次のような具合でインストールが容易であると喧伝されている。

WordPress is well-known for its ease of installation. Under most circumstances, installing WordPress is a very simple process and takes less than five minutes to complete.

だのに大急ぎで構築を仕上げねばならないときに限って次々とエラーに見舞われてちっとも5分以内じゃ成し遂げられないことが相次ぐものである。その上、少し間が空いてしまうと解決に導いたエラーの記憶がすっかりと抜け落ち再び同じ内容に悩まされて貴重な時間を浪費するからいい加減、文章として残しておこうというものである。

一番目に直面するのは「お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。」というエラーメッセージである。此れはphp-mysqlndパッケージが不足している為に発生するものであるからRemi’s RPM repositoryの辺りからサッとインストールして終いである。

$ sudo yum install --enablerepo=remi-php73 php-mysqlnd
$ sudo systemctl restart httpd.service

次に立ちはだかるのが「データベース接続確立エラー」というやつである。MySQL8系が導入されている環境であって、ユーザー名とパスワードに間違いがなくてホスト名も正しくMySQLが動作しているにもかかわらずこのエラーが出現するなら十中十一程度の割合でMySQLの認証プラグインが原因であるとおもう。

この当て推量を確かなものにするため wp-config-sample.php をコピーして wp-config.phpを拵え、WP_DEBUG の値を true に置き換えてDEBUGモードを有効にし、改めてインストールを試みてみるとこうである。

The server requested authentication method unknown to the client と云うのだからもうすっかり裏付けが保証されたものである。こうなればユーザの認証プラグインを mysql_native_password に変更すれば問題が解消される。

mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'p@ssw0rd';

最後は「wp-config.php ファイルに書き込みできません。」 というものでインストールディレクトリのパーミッションに特段の問題が無いのにこういった訴えを受けた場合はSELINUXを無効にセットすると解決する。

$ sudo vi /etc/sysconfig/selinux
#SELINUX=enforcing
SELINUX=disabled

$ sudo reboot

こうしてインストールはつつがなく完了するようになった。

ownCloudのインストール時にMySQLのエラーが表示されて処理がちっとも進まない

ownCloud: 10.3.2
MySQL: 8.0.18

ownCloudをインストールしようとするとこういうエラーメッセージを受け取るようになった。

Error while trying to create admin user: Failed to connect to the database: An exception occured in driver: SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

どうもMySQL8系からは認証プラグインにcaching_sha2_passwordが標準で採用されるようになり、従来からのmysql_native_passwordから置き換わった模様である。ownCloud 10.3.2はこの流れに未だ対応していない為にエラーとなっているのである。これを避けるために一先ずMySQL接続ユーザの認証プラグインをかつてのmysql_native_passwordへと設定した。

mysql> create user 'ocadmin'@'localhost' identified by 'p@ssw0rd';
mysql> grant all on owncloud.* to 'ocadmin'@'localhost' with grant option;
mysql> select user, plugin from mysql.user where user = 'ocadmin';
+---------+-----------------------+
| user    | plugin                |
+---------+-----------------------+
| ocadmin | caching_sha2_password |
+---------+-----------------------+

mysql> alter user 'ocadmin'@'localhost' identified with mysql_native_password by 'p@ssw0rd' ;
mysql> select user, plugin from mysql.user where user = 'ocadmin';
+---------+-----------------------+
| user    | plugin                |
+---------+-----------------------+
| ocadmin | mysql_native_password |
+---------+-----------------------+

mysql> create database owncloud;

そうして改めてownCloudのインストールを試みると恙無く完了したのでよかった。

参考:
6.4.1.2 Caching SHA-2 Pluggable Authentication

MySQL関連のMuninプラグインを動作させる際に使用されるmysqladminのパスワードを別ファイルへ記載

OS: Ubuntu Server 18.04.1 LTS
Munin 2.0.37

Muninがデフォルトで準備して呉れたMySQLに関係するプラグインのうちmysqladminを内部で実行しているものはパスワードが必要であるから設定ファイルに直接書きつけると、プラグインの処理は進むものの mysqladmin: [Warning] Using a password on the command line interface can be insecure. として不用心である旨、表示されるからこれを正す。パスワードは /etc/munin/.my.cnf へ記載するよう手配する。

$ sudo vi /etc/munin/plugin-conf.d/munin-node
[mysql*]
user root
#env.mysqlopts -uguro -pavava
env.mysqlopts --defaults-file=/etc/munin/.my.cnf
env.mysqladmin /usr/local/mysql/bin/mysqladmin

[client]セクションにユーザとパスワードを書き付けてrootユーザ以外はもはや誰も閲覧できないようパーミッションも併せて設定する。

$ sudo vi /etc/munin/.my.cnf
[client]
user=guro
password=avava

$ sudo chmod 600 /etc/munin/.my.cnf

そうしたらプラグインが正常に動作するかどうか munin-run --debug で確かめる。mysql_queriesプラグインは内部でmysqladminを使用しているからテストに適しているとおもう。

$ sudo munin-run --debug mysql_queries
# Processing plugin configuration from /etc/munin/plugin-conf.d/munin-node
(snip)
# Environment mysqlopts = --defaults-file=/etc/munin/.my.cnf
# Environment mysqladmin = /usr/local/mysql/bin/mysqladmin
# Environment mysqluser = guro
# About to run '/etc/munin/plugins/mysql_queries'
delete.value 111
insert.value 729
replace.value 0
select.value 34614
update.value 3245

エラーメッセージは表示されず問題はなさそうであるからあとはmunin-nodeを再起動して終いである。

$ sudo /etc/init.d/munin-node restart
[ ok ] Restarting munin-node (via systemctl): munin-node.service.

グラフも恙無く描画され続けている模様である。

参考:
MySQL :: MySQL 8.0 Reference Manual :: 6.1.2.1 End-User Guidelines for Password Security

MySQL8.0ではGRANT構文でユーザを作成できない

OS: Ubuntu Server 18.04 LTS
MySQL 8.0.12

MySQLの公式サイトへアクセスすると黄色くてまるい大変な笑顔の黄色がMySQL8.0の登場を触れていたのでこれをソースからインストールした。5.7.21のソースインストールと手順は全然違わないけれどもユーザの作成が今までと異なっていた。

mysql> grant all on *.* to 'guro'@'localhost' identified by 'avava' with grant option;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by 'avava' with grant option' at line 1

こういう有様である。GRANT構文で暗黙のうちにユーザも作成することはMySQL5.7まではなんとなく許されていたように思うけれどもMySQL8.0からは容赦しない情勢である。公式文献でも普通はCREATE USER構文で以ってユーザを作成して、然る後にGRANT構文で権限を与えるという順番が本当である旨、記載されている。尤もな話である。

Normally, a database administrator first uses CREATE USER to create an account and define its nonprivilege characteristics such as its password, whether it uses secure connections, and limits on access to server resources, then uses GRANT to define its privileges.

mysql> create user 'guro'@'localhost' identified by 'avava';
Query OK, 0 rows affected (0.14 sec)

mysql> grant all on *.* to 'guro'@'localhost' with grant option;
Query OK, 0 rows affected (0.19 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.22 sec)

参考:
How to grant all privileges to root user in MySql 8.0
13.7.1.6 GRANT Syntax

systemdを用いてマシン起動時にMySQLを起動するよう設定

OS: Ubuntu Server 16.04
MySQL 5.7.21

大変な権勢を誇っているsystemdで以ってMySQLの起動や停止を管理しようと息巻いてオンラインの文献を二、三斜め読みしたところでこれはえらいものに手を出してしまったぞと気付いた。マニュアルが多数あり分量も膨大でどこから手を付けていいか途方に暮れた。も少し軽薄に臨む心づもりでいたからこれには参った。とまれMySQLのドキュメントを見ているとcmakeのオプションでsystemd用のファイルをインストールするものがあるようである。

-DWITH_SYSTEMD=bool

Whether to enable installation of systemd support files. By default, this option is disabled. When enabled, systemd support files are installed, and scripts such as mysqld_safe and the System V initialization script are not installed. On platforms where systemd is not available, enabling WITH_SYSTEMD results in an error from CMake.

-DWITH_SYSTEMD=1を加えてMySQLをビルド、インストールしてみるとなるほどmysqld.serviceというファイルがインストールディレクトリに放り込まれて居る。どのような取り扱いが定石であるか判然としないけれども、手探りで設定したところなんだか希望どおりには動いている模様である。まずはMySQLの起動オプションを書き付けた。

$ sudo vi /etc/default/mysql
MYSQLD_OPTS="--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=mysql.err --pid-file=/usr/local/mysql/data/mysql.pid"

次にユニットファイル(mysqld.service)を/etc/systemd/system/へコピーし、みずからの環境に合致するようオプションを編集した。

$ cd /usr/local/mysql
$ sudo cp mysqld.service /etc/systemd/system/
$ sudo vi /etc/systemd/system/mysqld.service
#PIDFile=/var/run/mysqld/mysqld.pid
PIDFile=/usr/local/mysql/data/mysql.pid

#ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
ExecStart=/usr/local/mysql/bin/mysqld --daemonize $MYSQLD_OPTS

#EnvironmentFile=-/etc/sysconfig/mysql
EnvironmentFile=-/etc/default/mysql

そうしたらシステムの起動時にMySQLが起動するようsystemctl enableコマンドで執り成してやる。マシンを再起動してみるとたしかにMySQLが自動で立ち上がっているので概ね成功と言ってよかろうとおもう。

$ sudo systemctl enable mysqld.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /etc/systemd/system/mysqld.service.

$ systemctl list-unit-files mysqld.service
UNIT FILE      STATE
mysqld.service enabled

なお手動でMySQLを起動するならこういう具合である。ステータスを確認することもできるようである。

$ sudo systemctl start mysqld
$ sudo systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/etc/systemd/system/mysqld.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-03-22 20:42:22 JST; 15s ago
(snip)
Mar 22 20:42:22 mysql-systemd-test systemd[1]: Started MySQL Server.

ユニットファイルの全貌はこういう塩梅である。

$ cat /etc/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/usr/local/mysql/data/mysql.pid
TimeoutSec=0
PermissionsStartOnly=true
ExecStartPre=/usr/local/mysql/bin/mysqld_pre_systemd
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/usr/local/mysql/data/mysql.pid $MYSQLD_OPTS
EnvironmentFile=-/etc/default/mysql
LimitNOFILE = 5000
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false

参考:
systemd.exec
systemd – ArchWiki
systemd – Wikipedia
2.5.10 Managing MySQL Server with systemd
What is $OPTIONS in a systemd service file?