📌

php-fpm環境にMonitを導入してサーバーを監視する

2025/03/22に公開

背景

WordPressの案件で、突如php-fpmが停止しサイトへの接続ができなくなるトラブルが発生しました。再発防止のため、サーバー監視ツールMonitを導入し、php-fpmの監視と自動復旧を行うことにしました。

インストール

まずはmonitをインストールします。

sudo yum install monit

インストール後、以下のコマンドでMonitが正しくインストールされているか確認します。

sudo monit -V

以下のように出力されていたらOKです。

This is Monit version 5.14 
Copyright (C) 2001-2015 Tildeslash Ltd. All Rights Reserved.

Monit設定

インストールすると/etc/配下にmonitrcのファイルが生成されるので、monitrcを以下の様に設定します。

# Monit の監視間隔(30秒ごとに監視を実行)
set daemon 30
# サーバー起動後、5秒待機してから監視を開始(設定変更時の不要なアラートを防ぐため)
with start delay 5

# web ステータスチェック
set httpd port 2812 and
use address localhost
allow localhost

# アラートメールの送信先
set alert root@localhost 

# 設定ファイルのインクルード(monit.d 以下の設定を読み込む)
include /etc/monit.d/*

上記設定したら保存します。

自動起動する

monitをOS再起動時に自動起動するように以下のコマンドを実行します。

sudo systemctl enable monit

これでmonitがOSの起動時に自動で動作するようになります。

次にphp-fpmをOS再起動時に自動起動するように以下のコマンドを実行します。

sudo systemctl enable php-fpm

これでphp-fpmがOSの起動時に自動で立ち上がるようになります。

monit.d配下にphp-fpmの監視設定を追加する

次に /etc/monit.d/ 配下にphp-fpmファイルを追加して、php-fpmの監視設定を追加します。

sudo vi   /etc/monit.d/php-fpm

でphp-fpmのファイルを生成、以下のように設定します。

check process php-fpm with pidfile /run/php-fpm/php-fpm.pid
    start program = "/bin/systemctl start php-fpm"
    stop program  = "/bin/systemctl stop php-fpm"
    if failed unixsocket /run/php-fpm/www.sock then restart
    if does not exist then restart
    if 5 restarts within 5 cycles then timeout

設定したら保存します。

※pidfileのパス (/run/php-fpm/php-fpm.pid) は環境によって異なる可能性があります。
sudo find / -name php-fpm.pid を実行し、正しいパスを確認してから設定してください。

設定ファイルの起動・チェック

設定を追加したら、以下の手順でmonitを反映させます。

まずはmonitの設定チェックします。

sudo monit -t

※Control file syntax OKと出れば問題なしになります。

次にmonitを再起動させます。

sudo systemctl restart monit

monitの状態確認をします。

sudo monit status

を打ってphp-fpmが監視対象になっていることを確認します。
以下のように出力されればOKです。

Monit 5.33.0 uptime: 0m

Process 'php-fpm'
  status                       OK
  monitoring status            Monitored
  monitoring mode              active
  on reboot                    start
  pid                          650
  parent pid                   1
  uid                          0
  effective uid                0
  gid                          0
  uptime                       1h 12m
  threads                      1
  children                     7
  cpu                          -
  cpu total                    -
  memory                       1.1% [41.8 MB]
  memory total                 21.2% [774.0 MB]
  security attribute           -
  filedescriptors              10 [1.0% of 1024 limit]
  total filedescriptors        52
  read bytes                   0 B/s [404.2 kB total]
  disk read bytes              0 B/s [32.2 MB total]
  disk read operations         0.0 reads/s [24781 reads total]
  write bytes                  0 B/s [227 B total]
  disk write bytes             0 B/s [44 kB total]
  disk write operations        0.0 writes/s [6 writes total]
  unix socket response time    0.066 ms to /run/php-fpm/www.sock type TCP protocol DEFAULT
  data collected               Fri, 21 Mar 2025 17:31:34

System 'xxxxxxxxxxxxxx'
  status                       OK
  monitoring status            Monitored
  monitoring mode              active
  on reboot                    start
  load average                 [0.01] [0.00] [0.00]
  cpu                          0.0%usr 0.0%sys 0.0%nice 0.0%iowait 0.0%hardirq 0.0%softirq 0.0%steal 0.0%guest 0.0%guestnice
  memory usage                 1.0 GB [28.9%]
  swap usage                   0 B [0.0%]
  uptime                       1h 12m
  boot time                    Fri, 21 Mar 2025 16:19:02
  filedescriptors              2816 [0.0% of xxxxxxxxxxxxxxxxxxx limit]
  data collected               Fri, 21 Mar 2025 17:31:34

php-fpmを強制終了して動作検証する

php-fpmが異常終了した場合に、Monitが自動で復旧できるかを確認します。
以下のコマンドでphp-fpmを強制終了し、Monitが再起動することを確認します。

sudo pkill -9 php-fpm

その後、以下のコマンドで状態を確認します。

sudo monit status

php-fpmが自動で再起動され、"status OK" になっていればOKです。

感想

初めてMonitを導入し、設定の書き方やエラー対処など、試行錯誤しながら進めました。
特に、monitrcの書き方や pidfileの確認などでつまずきましたが、手順を整理することでスムーズに設定できるようになりました。
今後も、なるべくダウンタイムを発生しないよう各案件に監視ツールを導入して品質向上をしていきたいと思います。

Discussion