さくら vps で 落ちた時に自動再起動させる monit

2014年3月23日更新 view: 458 view
photoBy: http://www.autosportdirect.com.au/site_files/399/…

サーバーを自動的に再起動させよう

いきなりサーバーが落ちてしまった

まずは原因を探ろう

tail -n 500 /var/log/messages

これで最新500行のログを見れる。

Out of memory: Kill process 10444 (httpd) score 2 or sacrifice child

というのがあればメモリ使いすぎて自動落ち。

メモリを使わないように設定するには?

  • php.ini max_execution_time の設定を見直す(cron等で無限ループになっている可能性)
  • 重いcron処理を解除

万が一のために自動再起動設定したい

monitを使おう

monit とは、サーバーを監視してくれるサービス。
httpd , mysql , mailサーバーなど動いているサービスが止まったらすぐに再起動してくれる。

インストール

sudo yum -y install monit
sudo chkconfig monit on

・/etc/monit.conf を設定

set daemon 10
# アラートメールの送信サーバーを指定(※Gmailを使用する場合の例)
set mailserver smtp.gmail.com port 587 username "あなたのGmailアドレス" password "あなたのパスワード" using tlsv1
# Webブラウザからモニタリング状況を確認できるようにする
set httpd port 2812 and
    allow admin:monit

初期にある set httpd port らへんにあるのはすべてコメントアウトして、上記を追加。でないとログインできない。

各種サービス毎に自動起動ファイルを新規作成

まずはフォルダ移動

cd /etc/monit.d/

・httpd (vim httpd)

check process httpd with pidfile /var/run/httpd/httpd.pid
start program = "/etc/init.d/httpd start" with timeout 60 seconds
stop program = "/etc/init.d/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

pid の場所が異なる場合があるので、
find / -name '*httpd.pid*' -print で探す。
また、 SERVER-IP-ADDRESS (2箇所) はカッコを外してサーバー固有のグローバルIPアドレスを設定。

・nginx

check process nginx with pidfile /var/run/nginx.pid
start program = "/etc/init.d/nginx start"
stop  program = "/etc/init.d/nginx stop"

基本的には pid を検索して、上記nginxを参考に、 process, start,stop の 3つを指定すれば良い
find / -name '*pid*' -print

・nginxの時は、php-fpmも。

check process php-fpm with pidfile /var/run/php-fpm/php-fpm.pid
start program = "/etc/init.d/php-fpm start"
stop program = "/etc/init.d/php-fpm stop"

・mysql

check process mysqld with pidfile "/var/run/mysqld/mysqld.pid"
start = "/etc/init.d/mysqld start"
stop = "/etc/init.d/mysqld stop"
if failed unixsocket /var/lib/mysql/mysql.sock with timeout 60 seconds then restart
if 5 restarts within 5 cycles then timeout

・redis (サービスをデーモン化してから)

/var/run/redis/redis.pid
check process redis with pidfile /var/run/redis/redis.pid
start program = "/etc/init.d/redis start"
stop program = "/etc/init.d/redis stop"

・sshd(これは必要ないかも)

check process sshd with pidfile /var/run/sshd.pid
start program "/etc/init.d/sshd start" with timeout 60 seconds
stop program "/etc/init.d/sshd stop"
if failed port 22 protocol ssh then restart
if 5 restarts within 5 cycles then timeout
スポンサードリンク

・memcached

check process memcached with pidfile /var/run/memcached/memcached.pid
start program = "/etc/init.d/memcached start"
stop program = "/etc/init.d/memcached stop"
if failed host 127.0.0.1 port 11211 protocol memcache then restart
if cpu > 60% for 2 cycles then alert
if cpu > 98% for 5 cycles then restart
if 2 restarts within 3 cycles then timeout
group cache

・cron

check process crond with pidfile /var/run/crond.pid
start program = "/etc/init.d/crond start"
stop program = "/etc/init.d/crond stop"
if 5 restarts within 5 cycles then timeout

・gearmand

set logfile /var/log/monit.log
check process gearmand with pidfile /var/run/gearmand/gearmand.pid
start program = "/etc/init.d/gearmand start"
stop program = "/usr/bin/killall /etc/init.d/gearmand"

・ /etc/sysconfig/iptables

#iptables に追加
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2812 -j ACCEPT

service iptables restart
iptables -L

#再起動
service monit restart

"http://[Monitが動作しているサーバーのアドレス]:2812"というURLにアクセスすることでモニタリング状況がWebブラウザから確認できます。このときユーザIDをパスワードを求められますが、それぞれ"admin"と"monit"と入力すればログインできます。

・cronに設定

*/31 * * * * /usr/bin/monit monitor all

パスが違う場合があるので
find / -name '*monit*' -print で場所を探す

インストールと設定はここまでです。
お疲れ様でした。

ちゃんと動くか確認

http://your.com:2812/ へアクセス。

当然だが、monitが動いていないとログインできないので、注意。

admin , monit でログイン。

一気にすべてのサービスを止める。

service httpd stop
service mysqld stop
service sendmail stop
service sshd stop
service crond stop

停止させると、Does not exist に。
しばらく待って、Execution failed が running にすぐに再起動すればOK。

/etc/monit.conf

set daemon 60

これで正常に動けば自動再起動するようになります。
お疲れ様でした。

スポンサードリンク

関連記事

関連カテゴリ

コロ助

web関連の記事や制作系の記事をどんどんまとめていきます。 宜しくお願いします!

ピックアップ

パソコン・ソフトウェア ランキング

6月22日 ( 木 ) にアクセスが多かった記事はこちら!