😴

WordPressの運用で「データベース接続確立エラー」が頻発するのでMonitでMariaDBを自動復旧

2024/02/20に公開

はじめに

これまでAWS LightsailやGCP Compute EngineでWordPressを運用していると、データベースが停止して「データベース接続確立エラー」と表示される状況が頻発していました。AWS Lightsailのときはメモリーを1GBに増やしたらエラーがなくなったのですが、GCP Compute Engineはメモリーが1GBのインスタンスでもエラーになってしまいました。

データベースが停止するとSSHでログインしてデータベースを起動していました。さすがにその作業を続けるのは面倒だったので、サービスの稼働状況を監視して自動的に再起動する方法をさがしていたら以下の記事を見つけました。

https://qiita.com/narishi1972/items/009270fc8518946e7174

https://qiita.com/Hi_Noguchi/items/edae7298270012df1493

https://wpbeaches.com/set-monit-to-monitor-mariadb-on-a-cloudpanel-instance-on-ubuntu-22-04/

セットアップ

Monitをインストールします。

sudo apt install monit

デフォルトではMariaDBの設定ファイルはなかったので、MySQLの設定ファイルにシンボリックリンクを張ります。

sudo ln -s /etc/monit/conf-available/mysql /etc/monit/conf-enabled/

設定ファイルの一部を以下のように変更します。

/etc/monit/conf-available/mysql
 check process mysqld with pidfile /var/run/mysqld/mysqld.pid
   group database
   group mysql
+  start program = "/etc/init.d/mariadb start"
+  stop  program = "/etc/init.d/mariadb stop"
-  start program = "/etc/init.d/mysqld start"
-  stop  program = "/etc/init.d/mysqld stop"
   if failed host localhost port 3306 protocol mysql with timeout 15 seconds for 3 times within 4 cycles then restart
   if failed unixsocket /var/run/mysqld/mysqld.sock protocol mysql for 3 times within 4 cycles then restart
   if 5 restarts with 5 cycles then timeout
   depend mysql_bin
   depend mysql_rc

 check file mysql_bin with path /usr/sbin/mysqld
   group mysql
   include /etc/monit/templates/rootbin

+check file mysql_rc with path /etc/init.d/mariadb
-check file mysql_rc with path /etc/init.d/mysqld
   group mysql
   include /etc/monit/templates/rootbin

Monitをリロードして設定を反映します。

sudo systemctl reload monit

Monitを自動起動するように設定します。

sudo systemctl enable monit 

動作確認

MariaDBを停止します。

sudo systemctl stop mariadb

WordPressにアクセスすると「データベース接続確立エラー」と表示され、数分後にアクセスしたら復旧していたので、MonitがMariaDBを起動してくれたことが確認できました。

おわりに

データベースはクラウドサービスを利用することが多くなり、自分で運用する機会は少なくなりました。でも、自分で運用できるようにしておくことも大事かなと思って、今回のような機会を活かして自分の知識をアップデートしていきたいと思います。

Discussion