php-fpm環境にMonitを導入してサーバーを監視する
背景
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