Monit でプロセス監視 ( WordPress Advent Calendar 2013 全部オレ 20日目 )

WordPress Advent Calendar 2013 全部オレ 20日目のできる限り俺です。

WordPress を運用するサーバでは、Nginx や Aapche などの Web サーバ、MySQL、fastcgi を使っているのならば php-fpm などのプロセスが稼働しています。
夜中だとか旅行中にこれらのプロセスが落ちてしまうとサイトに繋がらなくなってしまうこともあります。
そういった障害を検知し、復旧するための様々な障害検知を行うツールが存在するのですが、今回は Monit の紹介をしようと思います。
これはプロセスを監視して異常を検知したらメールを出したり、自動的に再起動したりしてくれる便利なツールです。

何はともあれインストール

Amazon Linux や RHEL 系の OS を使っているなら yum でインストールしましょう。

$ sudo yum install monit
$ sudo chkconfig monit on

monit の設定は /etc/monit.conf で行います。
こんな感じで良いですかね?

# monit の監視間隔
set daemon 30
  with start delay 5

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

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

# 設定ファイルのインクルード
include /etc/monit.d/*

監視プロセスの設定

プロセスごとに /etc/monit.d の中にファイルを置いておくと管理が楽です。
yum でインストールすれば /etc/monit.d は作られていますが、ない場合は mkdir /etc/monit.d してやってください。

nginx の例
/etc/monit.d/nginx

check process nginx
  with pidfile /var/run/nginx.pid
  start program = "/sbin/service nginx start"
  stop program = "/sbin/service nginx stop"
  if failed host (SERVER-IP-ADDRESS) port 80 send "GET / HTTP/1.1\r\nHost: (SERVER-IP-ADDRESS)\r\n\r\n" expect "HTTP/1\.[01x] [1-4][0-9]{2} .*\r\n" with timeout 60 seconds then restart
  if 1000 restarts within 1000 cycles then timeout

※ (SERVER-IP-ADDRESS) は、サーバ自身のグローバル IP アドレスを指定してください

apache の例
/etc/monit.d/httpd

check process httpd with pidfile /var/run/httpd.pid
  start program = "/sbin/service httpd start"
  stop program  = "/sbin/service httpd stop"
  if failed host (SERVER-IP-ADDRESS) port 80 send "GET / HTTP/1.1\r\nHost: (SERVER-IP-ADDRESS)\r\n\r\n" expect "HTTP/1\.[01x] [1-4][0-9]{2} .*\r\n" with timeout 60 seconds then restart
  if 1000 restarts within 1000 cycles then timeout

mysql の例
/etc/monit.d/mysqld

check process mysqld
  with pidfile /var/run/mysqld/mysqld.pid
  start program = "/sbin/service mysqld start"
  stop program = "/sbin/service mysqld stop"

※ /etc/my.cnf で pid-file=/var/run/mysqld/mysqld.pid を設定していない場合、pid ファイルが別の名前で作られているかもしれません。そのときは、適宜 /etc/my.cnf に従って修正してください

php-fpm の例
/etc/monit.d/php-fpm

check process php-fpm
  with pidfile /var/run/php-fpm/php-fpm.pid
  start program = "/sbin/service php-fpm start"
  stop program = "/sbin/service php-fpm stop"

ssh の例
/etc/monit.d/sshd

check process sshd with pidfile /var/run/sshd.pid
  start program "/sbin/service sshd start"
  stop program "/sbin/service sshd stop"
  if failed port 22 protocol ssh then restart
  if 5 restarts within 5 cycles then timeout

設定が終わったら service monit start で起動してみましょう。

monit が起動したら、プロセスを停止して起動するか確かめてみてください。
30秒周期で監視しているので、最大でも30秒後にはプロセスが再起動しているはずです。
サービスを監視対象から外したいときは /etc/monit.d ディレクトリから監視対象から外したいサービスの設定ファイルを削除しましょう。

ちなみに現在配布しているマーケットプレイス版の 網元AMI には monit がインストールされていて nginx, mysql, php-fpm の各プロセスを監視しています。

それでは、良い監視ライフを!

WordPress あまり関係なかった

コメントを残す

メールアドレスが公開されることはありません。