web-dev-qa-db-ja.com

Monit:URLを最適に監視する方法

私のウェブサーバーはphp5-fpmでnginxを実行しています。何らかの問題が発生した場合、通常はphp5-fpmがハングアップし、「bad gateway」サーバーエラーが発生します。もちろん、nginxがクラッシュする可能性がある場合、いつかはわかりません。

何かが発生すると、両方のプロセス(およびそのスレッド)が通常存在し、再起動が必要になります。現在の問題の原因にはあまり関心がありませんが、両方のプロセスを再起動したいと思います。そのために、2つのbashスクリプト/etc/monit/webserver.start.shと/etc/monit/webserver.stop.shを作成します。

これが私のconf設定ファイルです(conf.dにあります):

check process webserver with pidfile /var/run/nginx.pid
   start program = "/etc/monit/webserver.start.sh"
   stop program  = "/etc/monit/webserver.stop.sh"
   if failed (url https://www.myserver.com/example/ and content == 'test string' and timeout 20 seconds)
     then alert
   if failed (url https://www.myserver.com/example/ and content == 'test string' and timeout 20 seconds)
     for 2 cycles
     then restart
   if failed (url https://www.myserver.com/example/ and content == 'test string' and timeout 20 seconds)
     for 4 cycles
     then exec "/sbin/reboot"

それは完全に間違っているわけではありませんが、いくつかの質問が残っています:

  1. 実際には、ここでnginxプロセスを監視するのではなく、ポート/ URLを監視します。 check processの代わりに他のチェックを使用できますか?
  2. 1つの失敗、2つの失敗、および4つの失敗後に異なるアクションを実行するには、3つのif failed条件が必要であり、その結果3つのサーバー要求が発生します。サイクルごとに1つの要求を実行し、異なる数の失敗後に異なるアクティビティを実行する方法はありますか?

公式のモニターリファレンスからの回答を見つけようとしましたが、明らかに、そのソースに記載されている可能性を理解していません。したがって、私はいくつかのアドバイスに非常に気を配ります。

更新

Monitのマニュアルページでmot時間を費やした後(私の意見では、オンラインマニュアルよりも構造が優れています)、次の最適化を見つけました。

CHECK Host webserver WITH ADDRESS 127.0.0.1
  START PROGRAM = "/etc/monit/webserver.start.sh"
  STOP PROGRAM  = "/etc/monit/webserver.stop.sh"
  IF NOT EXIST THEN ALERT
  IF FAILED (url https://www.mydomain.tld/example/ and content == 'test content' and timeout 20 seconds)
    FOR 2 CYCLES
    THEN RESTART
  IF 2 RESTARTS WITHIN 5 CYCLES
    THEN EXEC "/sbin/reboot"

この変更には、最初のURL失敗時のアラートは含まれていません(回避策は、ダミーの開始/停止コマンドを使用することです)。ただし、2が失敗し、4が再起動した後、1回のサーバー要求で再起動できます。

それはまだ完璧ではありません。誰かがそれをよりよくする方法を知っているなら、アドバイスは大歓迎です:)ありがとう!

更新

いくつかのテストの後、私はしないでください 2次アクションにmonitのタイムアウト機能(IF 2 REsTARTS WITHIN...)を使用することをお勧めします。特定の状況下では、再起動後にタイムアウトアクションが再実行されるようです。私の場合、これにより複数の再起動が発生しました:

[CET Dec 28 05:59:50] error    : skipping queued event /var/monit/id - unknown data format
[CET Dec 28 05:59:50] error    : skipping queued event /var/monit/state - unknown data format
[CET Dec 30 03:10:52] error    : 'webserver' failed protocol test [HTTP] at INET[www.myserver.com/example/] via TCPSSL -- HTTP: Error receiving data -- Resource temporarily unavailable
[CET Jan  1 03:08:10] error    : 'webserver' failed protocol test [HTTP] at INET[www.myserver.com/example/] via TCPSSL -- HTTP: Error receiving data -- Resource temporarily unavailable
[CET Jan  1 03:09:30] error    : 'webserver' failed protocol test [HTTP] at INET[www.myserver.com/example/] via TCPSSL -- HTTP: Error receiving data -- Resource temporarily unavailable
[CET Jan  1 03:09:31] info     : 'webserver' trying to restart
[CET Jan  1 03:09:31] info     : 'webserver' stop: /etc/monit/webserver.stop.sh
[CET Jan  1 03:09:31] info     : 'webserver' start: /etc/monit/webserver.start.sh
[CET Jan  1 03:10:31] error    : 'webserver' failed, cannot open a connection to INET[www.myserver.com/example/] via TCPSSL
[CET Jan  1 03:10:31] info     : 'webserver' trying to restart
[CET Jan  1 03:10:31] info     : 'webserver' stop: /etc/monit/webserver.stop.sh
[CET Jan  1 03:10:31] info     : 'webserver' start: /etc/monit/webserver.start.sh
[CET Jan  1 03:10:31] error    : 'php-fpm' process is not running
[CET Jan  1 03:10:31] info     : 'php-fpm' trying to restart
[CET Jan  1 03:10:31] info     : 'php-fpm' start: /usr/sbin/service
[CET Jan  1 03:10:31] error    : 'nginx' process is not running
[CET Jan  1 03:10:31] info     : 'nginx' trying to restart
[CET Jan  1 03:10:31] info     : 'nginx' start: /usr/sbin/service
[CET Jan  1 03:11:32] error    : 'webserver' service restarted 2 times within 2 cycles(s) - exec
[CET Jan  1 03:11:32] info     : 'webserver' exec: /sbin/reboot
[CET Jan  1 03:12:24] info     : Starting monit daemon with http interface at [0.0.0.0:2812]
[CET Jan  1 03:12:24] info     : Monit start delay set -- pause for 240s
[CET Jan  1 03:16:24] info     : Starting monit HTTP server at [0.0.0.0:2812]
[CET Jan  1 03:16:24] info     : monit HTTP server started
[CET Jan  1 03:16:24] info     : 'Memory' Monit started
[CET Jan  1 03:16:24] error    : skipping queued event /var/monit/id - unknown data format
[CET Jan  1 03:16:24] error    : skipping queued event /var/monit/state - unknown data format
[CET Jan  1 03:16:24] error    : 'webserver' service restarted 2 times within 2 cycles(s) - exec
[CET Jan  1 03:16:24] info     : 'webserver' exec: /sbin/reboot
[CET Jan  1 03:17:04] info     : Starting monit daemon with http interface at [0.0.0.0:2812]
[CET Jan  1 03:17:04] info     : Monit start delay set -- pause for 240s
[CET Jan  1 03:21:04] info     : Starting monit HTTP server at [0.0.0.0:2812]
[CET Jan  1 03:21:04] info     : monit HTTP server started
[CET Jan  1 03:21:04] info     : 'Memory' Monit started
[CET Jan  1 03:21:04] error    : skipping queued event /var/monit/id - unknown data format
[CET Jan  1 03:21:04] error    : skipping queued event /var/monit/state - unknown data format
[CET Jan  1 03:21:04] error    : 'webserver' service restarted 2 times within 2 cycles(s) - exec
[CET Jan  1 03:21:04] info     : 'webserver' exec: /sbin/reboot
[CET Jan  1 03:21:44] info     : Starting monit daemon with http interface at [0.0.0.0:2812]
[CET Jan  1 03:21:44] info     : Monit start delay set -- pause for 240s
[CET Jan  1 03:25:44] info     : Starting monit HTTP server at [0.0.0.0:2812]
[CET Jan  1 03:25:44] info     : monit HTTP server started
[CET Jan  1 03:25:44] info     : 'Memory' Monit started
[CET Jan  1 03:25:44] error    : skipping queued event /var/monit/id - unknown data format
[CET Jan  1 03:25:44] error    : skipping queued event /var/monit/state - unknown data format
[CET Jan  1 03:25:44] error    : 'webserver' service restarted 2 times within 2 cycles(s) - exec
[CET Jan  1 03:25:44] info     : 'webserver' exec: /sbin/reboot

誰かが良い考えを持っているのでなければ、私は複数のリクエストに切り替えます。最後に、それらはそれほど時間がかかりません...

バーニンレオ

6
BurninLeo

ここではnginxプロセスを監視したくありませんが、ポート/ URLを監視します。チェックプロセスの代わりに他のチェックを使用できますか?

ホストチェックを使用できます。これは、monitサイトの例です。

check Host mmonit.com with address mmonit.com 
    if failed
        port 80 protocol http
        with http headers [Host: mmonit.com, Cache-Control: no-cache, Cookie: csrftoken=nj1bI3CnMCaiNv4beqo8ZaCfAQQvpgLH]
        and request /monit/ with content = "Monit [0-9.]+"
    then alert

1つの失敗、2つの失敗、および4つの失敗の後で異なるアクションを実行するには、失敗した場合に3つの条件が必要であり、その結果3つのサーバー要求が発生します。サイクルごとに1つの要求を実行し、異なる数の後に異なるアクティビティを実行する方法はありますか?の失敗?

EXECを使用して任意のプログラムを実行し、アラートを送信できます。このアクションを選択する場合は、実行するプログラムを指定する必要があり、プログラムが引数を必要とする場合は、プログラムとその引数を引用符付きの文字列で囲む必要があります。オプションで、実行時に実行されるプログラムが切り替わるuidとgidを指定できます。例えば:

exec "/usr/local/Tomcat/bin/startup.sh"
    as uid nobody and gid nobody
6
Moti