KUSANAGIはウェブサービスも監視しています|ω・)


目次

はじめに[ご挨拶]

この度、プライム・ストラテジー様のサイト上でKUSANAGIに関連したコラムを掲載させていただくこととなりました、NHNテコラスの遠藤と申します。
主にEX-CLOUD(エクスクラウド)というホスティングサービスブランドでの顧客サポートやサービス企画などを担当しております。

KUSANAGIを搭載したホスティングサービスは2016/10月より提供しており、EX-CLOUD for KUSANAGI誕生秘話を書いたりもしましたが、このように自社サービス上のブログでもKUSANAGIに関連した記事を投稿する場合があるため、プライム・ストラテジー様のサイト上ではネタ切れにならないよう、2ヶ月に1記事ペースの小出しで投稿させていただく予定です。

monitによる監視

早速ですが、KUSANAGIにはmonitという監視ツールが搭載されております(バージョン7.8.3より)
monit自体は設定によりURL死活監視やプロセス監視などが行えますが、KUSANAGIではウェブサービスのログ監視を行うように設定されています。
(アクセスログを監視し、500番台のエラーを検知したらプロセス再起動にて復旧を試みる)

ここまではKUSANAGIのバージョンアップ情報に記載されている情報ですが、監視によりプロセス再起動時にメール通知を行うことが可能なため、設定方法を紹介いたします。
(稀にプロセス再起動が行われてる程度であればまだ良いのですが、頻度な再起動が行われている場合はコンテンツの見直しやメモリなどのリソースを見直す目安になるのでログ解析を定期的に行われていない場合はメール通知の方が気付きの切っ掛けになります)

KUSANAGI環境では次のファイルで設定を行っています。

設定ファイル:
/etc/monitrc
/etc/monit.d/*
※monit.d以下はプロファイル毎の監視設定ファイルやメール通知用のalert、logファイルの出力先を定義しているloggingファイルなどがあります

500番台のエラーの発生条件

アクセス過多により503 Service Unavailableとなる場合や、PHPやCGIの構文・不適切なパーミッション設定による 500 Internal Server Error、DBへの接続がタイムアウトとなり 502 Bad Gatewayとなる、などが考えられます。

monitによる再起動とメール通知

monitがエラーを検知した場合や再起動が行われた場合は/var/log/monit.logに記録されます。
また、初期設定では再起動した旨はメール通知が行われませんが、/etc/monit.d/alertを書き換えることで指定したメールアドレスに通知することも可能です。

# set alert root@localhost on {instance, timeout}
set alert xxxx@example.org
初期設定ではmonit自身が再起動した場合にroot@localhost(/var/spool/mail/root に通知されますが
上記2行は初期設定をコメントアウトし、 xxxx@example.org 宛てにメール通知したい場合の設定例です
set mailserver localhost
set mail-format {
from: kusanagi@$HOST
subject: [KUSANAGI MONIT] $SERVICE $EVENT at $DATE
message: Monit alert this action.
Please check monit status on $HOST.

Service: $SERVICE
Event: $EVENT
Action: $ACTION
Data: $DATE
Host: $HOST

$DESCRIPTION.
}
送信されるメール件名や内容もこのファイルで定義しますが、今回はメール通知の宛先のみ設定変更しました

設定変更後は、#  systemctl restart monit.service にてmonitを再起動してください。

メール通知条件の変更

/etc/monit.d/(プロファイル名)_nginx.conf で調整します※nginxで動作させている場合

check file (プロファイル名)_nginx with path /home/kusanagi/(プロファイル名)/log/nginx/access.log
        restart program = "/bin/kusanagi restart"
        depends on nginx
        if match '"(GET|POST) /.* HTTP/.*" 5[0-9][0-9] [0-9]+ ' for 2 cycle then restart
/etc/monitrc の設定に従い、初期設定では30秒毎に監視が行われますが、2回の監視で続けて500番台の
ログが記録されていたら再起動を行います。
        if 5 restarts within 5 cycles then alert
        if 5 restarts within 5 cycles then unmonitor
5回続けて再起動が行われた場合は監視を停止し、アラートを通知します。
        group nginx
・
・
以下SSL(https用)の設定が記述されていて、ログのpathのみ異なります

unmonitor(監視停止)されることで以後のメール通知も止まりますが、そのまま監視再開設定を忘れてしまう場合もありますので適宜、監視停止の設定はコメントアウトされても良いかもしれません。

監視状況や監視再開・停止などは次のようなコマンドで可能です。

・監視対象の情報の表示
# monit status

・すべての監視停止
# monit unmonitor all

・すべての監視再開
# monit monitor all

・監視対象を指定して実行することも可能です
# monit monitor (プロファイル名_nginx)

動作確認

不適切な設定のPHPやCGIを設置し、ウェブアクセスすることで擬似的にエラーをログに記録させられます。
index2.phpという不適切な設定のファイルを設置し、アクセスした場合のアクセスログ。

0.001 - - xxx.xxx.xxx.xxx - - [06/Feb/2017:20:33:17 +0900] "GET /index2.php HTTP/1.1" 500 5 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" "-"
0.002 - - xxx.xxx.xxx.xxx - - [06/Feb/2017:20:33:54 +0900] "GET /index2.php HTTP/1.1" 500 5 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" "-"

monitのログ /var/log/monit.log にも次のように記録され、再起動が行われます。

[JST Feb  6 20:34:01] info     : '(プロファイル名)_nginx' trying to restart
[JST Feb  6 20:34:01] info     : '(プロファイル名)_nginx' restart: /bin/kusanagi

メールでも通知がされました。

Monit alert this action.
Please check monit status on FQDN.Service: (プロファイル名)_nginx
Event: Content match
Action: restart
Data: Mon, 06 Feb 2017 23:34:01
Host: *****.com content match:
0.001 – – xxx.xxx.xxx.xxx – – [06/Feb/2017:20:33:17 +0900] “GET /index2.php HTTP/1.1” 500 5 “-” “Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko” “-”
0.001 – – xxx.xxx.xxx.xxx – – [06/Feb/2017:20:33:54 +0900] “GET /index2.php HTTP/1.1” 500 5 “-” “Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko” “-“

 

おまけ

monitによるメール通知について紹介しましたが、
メールプロセスが落ちている場合、メール通知は行われませんヾ(ーー )

実際にサーバの高負荷によりメールプロセスが落ちてしまい、WordPressで作成した記事に対してコメントがされていたが、コメント通知のメールが送信されていなくて気付かなかったというお問い合わせも頂戴したことがあります。

monitではプロセス監視も行えますので、sendmailなどのメールプロセスも監視していれば起動させることが出来なくもないですが、当社のサービスではcronでsendmailプロセスの有無をチェックし、プロセスが無い場合はsendmailを起動するように設定を初期状態で行っています。
(monitの設定ファイルをお客様への初期納品時にカスタマイズし、monitによる監視実装をしていない理由としては将来KUSANAGIがhttpdのログ監視以外にこのあたりの監視設定も初期で行うことがあったら、、、と思い、別の方法でメール監視を実装しました)

設定例:

/etc/cron.d/sendmail に以下を記述
*/10 * * * * root [[ ! -f '/var/run/sendmail.pid' ]] || [[ ! -d /proc/$(cat /var/run/sendmail.pid) ]] && systemctl start sendmail
10分毎にsendmailのプロセスファイルがあるかチェックし、存在しなければ再起動する

以上、KUSANAGIのことと少し離れてしまいましたが、標準でKUSANAGIに搭載されているツールの補足説明をさせていただきました。
また、4月ごろお邪魔させていただきますのでよろしくお願いいたします(*゚ー゚)(*。_。)

Post Author: 遠藤博樹(NHNテコラス株式会社)

遠藤博樹(NHNテコラス株式会社)

前職ではまだヒットチャート上位ランクインがステータスとなる2000年代に某女性3人組バンドのマネージャーを務めていてましたが、解散をきっかけに退社し、EX-CLOUDの前身サービスであるlivedoorレンタルサーバーのサービス開始と同時に2008年にNHNテコラス(旧社名ライブドア)に入社。以来、サポートスタッフとしてお客様対応を行っています。
最近では長年培ったお客様からの声を基に新サービスの企画なども担当していますが、ここでは主にKUSANAGI搭載ホスティングサービスを提供している中で、お客様からいただきましたお問い合わせをヒントに技術的な内容を書いていければと考えております。