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