バックエンドのGROWIサーバの電源が入っていない時に、「503 たぶんサーバの電源が切れています。」とフロントエンドのnginxに返してもらうための設定のようなもの(2/2,書き込み側のお話)。

By | 2021年2月5日 , Last update: 2022年4月12日

はじめに

前の記事でインターネット側で稼働しているnginxサーバ(以下、単に「nginxサーバ」と書きます。)をいい感じに設定して、MariaDBのテーブルからデータを読み出す方法について書きました。

そこで、この記事では自宅サーバ側で稼働しているGROWIサーバ(以下、単に「GROWIサーバ」と書きます。)の状態の通知用の入れ物(以下単に「入れ物」と書きます。)に稼働状態を書き込むために必要な設定について書きます。

スポンサーリンク

前提条件

この記事で登場するnginxサーバとGROWIサーバはOpenVPNで接続されています(GROWIサーバが稼働しているPCがactiveな状態である場合に限ります)。

上図の”OpenVPN Server”側にnginxサーバが、”OpenVPN Client”側にGROWIサーバがインストールされているイメージです。自宅サーバであるGROWIサーバは「気が向いた時だけ」稼働するサーバがである(*1)ため、OpenVPNのネットワークにはクライアントとして参加させています。

上記の条件(*1)がこの後で登場する設定の内容に地味に効いてきます。

準備するファイル

nginxサーバ上にある入れ物の正体はMariaDBのデータベースのテーブルであることは前の記事で書きましたが、これにGROWIサーバの稼働状態を書き込むためには、GROWIサーバの起動・終了用のファイル(Fedora 33ではユニットファイル)を書き、そのファイルから入れ物に対して稼働状態を書き込むためのコマンド(SQL文)を実行すれば良さそうです。

そこで、以下の2個のファイルを用意します。

  1. growi.service: ユニットファイルです。
  2. startgrowi.sh: 実際にGROWIサーバの起動・停止の実行及び稼働状態を書き込むためのSQL文の発行を行うshell script。

コード例

growi.service

growi.serviceのコード例は以下のような感じになります。

nginxサーバ及びGROWIサーバの間の接続はOpenVPNによる接続になりますので、接続が確立している状態の場合に限り、次節のstartgrowi.shを実行する必要があります(接続が確立された状態でないと、稼働状態を書き込むためのSQL文の実行時にMariaDBサーバが見つからずにエラーになってしまいます)。

そこで、3行目の設定にOpenVPNのクライアントの開始・終了用のサービスユニットファイル(openvpn-client@client.service)を追加しています。この設定を追加することで、システム起動時にOpenVPNのクライアントを起動してVPN接続を確立してからgrowi.serviceを実行することができます。また、システム終了時にはgrowi.service→OpenVPNのクライアントの順番に(終了処理を)実行することができます。

startgrowi.sh

startgrowi.shのコード例は以下のような感じになります(IPアドレス及びパスワードの部分は書き換えてあります)。


スポンサーリンク

mysqlコマンドはSQL文を実行すると終了して処理制御がshell script側(この例ではstartgrowi.sh)に戻ってくるため、GROWIサーバの開始時にはnpmコマンドの直前に、終了時にはpkillコマンドの直前にそれぞれ実行しています。

動作確認

GROWIサーバの稼働中

GROWIサーバの稼働中は、最新の稼働状況は以下のような感じとなります。

MariaDB [serverstatus]> select * from serverstatus order by id desc limit 0,1;
+----+--------+---------------------+
| id | status | updated_at          |
+----+--------+---------------------+
| 46 |      1 | 2021-02-04 21:51:30 |
+----+--------+---------------------+
1 row in set (0.000 sec)

GROWIサーバの停止中

前節の状態のときにGROWIサーバをshutdownすると、最新の稼働状況は…

MariaDB [serverstatus]> select * from serverstatus order by id desc limit 0,1;
+----+--------+---------------------+
| id | status | updated_at          |
+----+--------+---------------------+
| 47 |      0 | 2021-02-04 22:35:17 |
+----+--------+---------------------+
1 row in set (0.000 sec)

のような感じになります。

うまく動作しているようです。👍

IDの値が大きめなのは気にしない方向でお願いいたします。

まとめ

OpenVPN接続時のユニットファイルの設定例がGoogle先生にお伺いを立てても見つからず、MariaDBに稼働状態が書き込めない場合があって、その原因の究明に手間取ってしまったため、この記事を書くことにしました。

また、設定に必要なファイルがOSの起動・終了に関連する設定を行うもので、前の記事で書いた読み込み側の設定とは設定の種類が異なるように感じたので、別の記事に分割して書くことにした次第です。

データベースのテーブルに状態を示す変数を書き込んでサブシステム間の同期をとる方法は極めて古典的な方法かもしれませんが、何かの参考にしていただけると幸いです。

この記事は以上です。