Ubuntu 14.04でのMonitによるLEMPスタックモニタリング

前書き

Monitは、さまざまなイベントベースのアクションを実行できる無料のオープンソースサービス監視アプリケーションです。 Monitは、電子メール通知を送信したり、サービスやアプリケーションを再起動したり、その他のレスポンシブアクションを実行したりできます。

このチュートリアルは、基本的なLEMPスタック(Linux、Nginx、MySQL、PHP)で構築します。 Monitは、スタック内のすべてのサービスを監視し、悪条件のルートユーザーに警告するために組み込まれます。

オプションの外部Monitサーバーは、Webアプリケーションまたは他のサービスのリモート監視にも使用できます。

前提条件

  • 始める前に、まずUbuntu 14.04ドロップレットをセットアップする必要があります

  • sudo権限を持つ標準ユーザーアカウントが必要です。

  • このチュートリアルでは、既存のLEMPスタックにMonitを追加します。 初期LEMPスタックの作成方法に関するチュートリアルについては、https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14を参照してください-04 [Linux、nginx、MySQL、PHP(LEMP)スタックをUbuntu 14.04にインストールする方法]

  • オプション:リモートWebサイト、DNS、またはメールサーバーを監視する場合は、パブリックにアクセス可能なドメインまたはIPアドレスでそのサーバーをセットアップする必要があります(詳細は手順6を参照)

手順1-Monit通知の電子メール配信を構成する

システム監視の一部には、通常、アラートの電子メール通知が含まれます。 そのため、Monitが電子メール通知を送信するには、適切な電子メール配信が必要です。 典型的なMonitアラートメールは次のようになります。

From: [email protected]
To: [email protected]

Resource limit matched Service example.com

       Date:        Mon, 22 Dec 2014 03:04:06
       Action:      alert
       Host:        example.com
       Description: cpu user usage of 79.8% matches resource limit [cpu user usage>70.0%]

Your faithful employee,
Monit

このチュートリアルでは、アラートがトリガーされるたびにメールを送信するようにMonitをセットアップします。

注: Monitの通知は、デフォルトでスパムフォルダに送信される可能性があります。 メールが正常に配信される可能性が最も高くなるように、リバースDNS(PTRレコード)を適切に構成する必要があります。 Dropletのホスト名は完全修飾ドメイン名(FQDN)と一致する必要があるため、たとえば両方を*にすることができます。 DigitalOceanドロップレットのPTRレコードを編集するには、DigitalOceanコントロールパネルにアクセスします。 *設定*に移動し、*名前変更*タブを選択します。 新しいホスト名を入力して、 Rename *をクリックします。

このガイドでは、既存のメール転送エージェント(MTA)がないことを前提としているため、Postfixをインストールします。 Postfixのローカルインストールにより、システムはGmailやYahooなどの外部メールプロバイダーに通知メールを送信できます。

MTAとしてPostfixのインストールを開始するには、まずシステムのリポジトリソースリストを更新します。

sudo apt-get update

次に、UbuntuのリポジトリからPostfixおよびGNU Mailutilsパッケージをインストールします。

sudo apt-get install postfix mailutils

インストールの終わり近くに、以下のスクリーンショットに示すように、サーバー構成タイプを選択するよう求められます。 *インターネットサイト*を選択します。

image:https://assets.digitalocean.com/articles/Lemp_Monit/1.png [Postfix-インターネットサイトの選択]

*システムメール名*の入力を求められたら、ドロップレットの完全修飾ドメイン名(FQDN)を使用します。 *注意:*システムメール名は、後で `+ / etc / mailname +`で変更することもできます。

image:https://assets.digitalocean.com/articles/Lemp_Monit/2.png [Postfix-システムメール名の設定]

次に、編集するファイルを開きます。 このガイドではNanoを使用しますが、任意のテキストエディターを使用できます。

sudo nano /etc/aliases

ここで、Monitの通知メールを受信する個人のメールアドレスを追加します。 これらのメール通知は、LEMPサーバーのルートユーザーから送信されます。

postmaster: root
root:

必要に応じて、複数の宛先を追加することもできます。

root: , ,

変更を保存してNanoを終了します。 次に、次のコマンドを実行してエイリアスファイルを更新します。

sudo newaliases

ドロップレットからテストメッセージを送信して、メール配信を確認できます。 テストメッセージが受信トレイに最初に表示されない場合は、スパムフォルダーを確認してください。

echo test | mail -s "test message from my VPS" root

手順2-Monitのインストールと構成

MonitはUbuntuパッケージリポジトリでも利用できます。 Monitの簡単なリファレンスガイドについては、https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-monit [このチュートリアル]を参照してください。

Monitは、LEMPサーバーに以下を使用してインストールできます。

sudo apt-get install monit

Ubuntu 14.04では、Monit設定ファイルはにあり、メインのMonit設定ファイルは `+ / etc / monit / monitrc +`です。

編集のためにNanoで開くには:

sudo nano /etc/monit/monitrc

次の行のコメントを解除し、以下に示すように変更します。

set mailserver   #Use localhost for email alert delivery.

set mail-format {
     from: [email protected]$HOST
  subject: monit alert --  $EVENT $SERVICE
  message: $EVENT Service $SERVICE
                Date:        $DATE
                Action:      $ACTION
                Host:        $HOST
                Description: $DESCRIPTION

           Your faithful employee,
           Monit
}

set alert   #Set email address to receive alerts. This guide uses root mail.

ファイル内で、次の行のコメントを外し、サーバーのドメインまたはIPアドレスに合わせて変更します。

check system
   if loadavg (1min) > 4 then alert
   if loadavg (5min) > 2 then alert
   if memory usage > 75% then alert
   if swap usage > 25% then alert
   if cpu usage (user) > 70% then alert
   if cpu usage (system) > 30% then alert
   if cpu usage (wait) > 20% then alert

また、ファイルの最後にこのエントリを追加します。

check filesystem rootfs with path / #Alert if low on disk space.
   if space usage > 90% then alert

変更を保存してNanoを終了します。

手順3-MonitでLEMPサービスのサービス監視を構成する

Ubuntu 14.04では、Monitの設定は、 `+ / etc / monit / monitrc `ファイルで直接指定するか、 ` / etc / monit / conf.d / `の個々のファイルを介して指定できます。 このチュートリアルでは、個々のファイルは ` / etc / monit / conf.d / +`ディレクトリの下に作成されます。

最初に、サービスを管理する手段をMonitに提供します。 このチュートリアルを簡単にするために、すべてのプロセス監視を `+ / etc / monit / conf.d / lemp-services +`にある単一のファイルに配置します。 次のエントリを使用して、MonitはNginx、MySQL、PHP-FPMを監視し、何らかの理由でこれらのサービスが異常停止した場合、これらのサービスを再起動します。

Nanoを使用して作業ファイルを作成できます。

sudo nano /etc/monit/conf.d/lemp-services

LEMPスタックのサービスに次のエントリを追加します。

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

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

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

次に、変更を保存します。

手順4-正常でないLEMPサービスを再起動するためのアクションを追加する

Monitが選択したサービスを管理できるようになったので、必要に応じてサービスを再起動するアクションを追加できます。 たとえば、MonitにはTCP接続を監視する機能があります。 サーバーがHTTP接続を提供しなくなった場合、MonitはPHP-FPMまたはNginxを再起動して問題を自動的に解決できます。

既存の構成を構築するために、 `+ / etc / monit / conf.d / lemp-services +`をさらに編集します。 以下に追加する内容を示します。HTTP接続が使用できなくなった場合、MonitにNginxとPHP-FPMを再起動するよう指示します。 さらに、ソケットが利用できない場合、MonitにMySQLを再起動させます。

*注:*最初と3番目のエントリに表示されるドロップレットのドメインまたはIPアドレスを必ず使用してください。

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



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



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

変更を保存してNanoを閉じます。 次に、Monitを再起動して、これまでに行った設定変更を適用します。

sudo service monit restart

ステップ5(オプション)-エラーとキーワードのログを監視する

Monitは、特定のキーワードのログを監視し、アクションを実行したり、アラートを送信したりすることもできます。 これは、Webアプリケーションに問題がある場合、またはチームが特定のトレースバックまたはログからのイベントの通知を必要とする場合に役立ちます。

以下は、Monitが監視できるタイムアウトエラーとアラートのあるNginxログの例です。

2014/12/22 11:03:54 [error] 21913#0: *202571 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 2600:3c01::f03c:91ff:fe6e:5a91, server: example.com, request: "GET /wp-admin/admin-ajax.php?action=wordfence_doScan&isFork=1&cronKey=40cb51ccsdfsf322fs35 HTTP/1.0", upstream: "fastcgi://unix:/var/run/example.com.sock", host: "example.com"

既存の構成に基づいて、LEMPサービスの構成ファイルをNanoで再度開きます。

sudo nano /etc/monit/conf.d/lemp-services

次のエントリを追加します。 これは、PHP-FPMと通信するNginxからタイムアウトが発生したときに通知を送信します。

check file nginx-error with path /var/log/nginx/error.log
   if match "^timed out" then alert

変更を保存してNanoを閉じます。 次に、Monitを再起動して、変更を有効にします。

sudo service monit restart

ステップ6(オプション)-Monitを使用してリモートWebサイトおよびその他のサービスを監視する

Monitをローカルで使用することに加えて、Monitはさまざまな外部サービスと接続を監視できます。 この例では、既に設定したMonitのローカルインスタンスを使用し、外部サービス用の新しい監視設定を追加します。

帯域外の目的のために、外部のMonitシステムをまったく異なるデータセンターに配置することをお勧めします。 Webアプリケーションがニューヨークに拠点を置く場合、サンフランシスコに小さな外部Monitサーバーを配置することが理想的です。

以下は、Monitを実行している2番目のホストに実装できる外部Monitチェックの例です。 これらの例は外部サーバーの `+ / etc / monit / conf.d / lemp-external +`ファイルに配置され、**のLEMPスタックをリモートでチェックします。

Nanoを使用して、この構成ファイルを作成します。

sudo nano /etc/monit/conf.d/lemp-external

ICMP応答とHTTPおよびHTTPS接続を監視します。

# ICMP check
check host  with address
   if failed icmp type echo
       for 5 times within 5 cycles
       then alert

# HTTP check
   if failed
         port 80 protocol http
      for 5 times within 5 cycles
      then alert

# HTTPS check
   if failed
         port 443 type tcpSSL protocol http
      for 5 times within 5 cycles
      then alert

DNSの監視:

check host  with address
   if failed port 53 type udp protocol dns then alert

SMTPの監視:

check host  with address
   if failed port 25 type tcp protocol smtp then alert

WebアプリケーションのヘルスチェックURLを監視する

Webアプリケーションの場合、MonitはヘルスチェックURLで特定のリクエストを実行することもできます。 以下は、ヘルスチェックURLが `+ https:// remote-example.com / healthcheck +`のサイト**の例です。

check host  with address
   if failed
         port 443 type tcpSSL protocol http
      request "/healthcheck"
      for 5 times within 5 cycles
      then alert

ステップ7-コマンドラインからMonitを管理する

Monitはコマンドラインユーティリティも提供します。 そこから、単純なコマンドを使用して、全体的なMonitステータスを確認し、監視の一時的な開始や停止などの便利なタスクを完了できます。

コマンドラインからMonitステータスチェックを実行するには、Monit Webサービスを有効にする必要があります。 これを行うには、Nanoで編集するために「+ / etc / monit / monitrc +」を開きます。

sudo nano /etc/monit/monitrc

Webサービスをローカルで有効にするには、次の行のコメントを解除します。

set httpd port 2812 and
       use address localhost
       allow localhost

変更を保存してNanoを終了します。 次に、Monitを再起動します。

sudo service monit restart

コマンドラインからMonitのステータスを確認できるようになりました。

以下は、監視を一時的に無効および有効にするコマンドです。

sudo monit unmonitor all

sudo monit monitor all

ステップ8-レポートの表示

設定しているすべてのチェックのレポートを見てみましょう。

sudo monit status

これで、ローカルLEMPサービスや外部チェックなど、Monitがチェックするように設定したすべての出力が表示されます。

sudo monit status
The Monit daemon 5.6 uptime: 0m

System 'example.com'
 status                            Running
 monitoring status                 Monitored
 load average                      [0.00] [0.01] [0.05]
 cpu                               0.5%us 0.4%sy 0.0%wa
 memory usage                      115132 kB [22.9%]
 swap usage                        0 kB [0.0%]
 data collected                    Mon, 22 Dec 2014 16:50:42

Filesystem 'rootfs'
 status                            Accessible
 monitoring status                 Monitored
 permission                        755
 uid                               0
 gid                               0
 filesystem flags                  0x1000
 block size                        4096 B
 blocks total                      5127839 [20030.6 MB]
 blocks free for non superuser     4315564 [16857.7 MB] [84.2%]
 blocks free total                 4581803 [17897.7 MB] [89.4%]
 inodes total                      1310720
 inodes free                       1184340 [90.4%]
 data collected                    Mon, 22 Dec 2014 16:50:42

Process 'nginx'
 status                            Running
 monitoring status                 Monitored
 pid                               14373
 parent pid                        1
 uptime                            28m
 children                          4
 memory kilobytes                  1364
 memory kilobytes total            9228
 memory percent                    0.2%
 memory percent total              1.8%
 cpu percent                       0.0%
 cpu percent total                 0.0%
 port response time                0.018s to example.com:80 [HTTP via TCP]
 data collected                    Mon, 22 Dec 2014 16:50:42

Process 'mysql'
 status                            Running
 monitoring status                 Monitored
 pid                               12882
 parent pid                        1
 uptime                            32m
 children                          0
 memory kilobytes                  44464
 memory kilobytes total            44464
 memory percent                    8.8%
 memory percent total              8.8%
 cpu percent                       0.0%
 cpu percent total                 0.0%
 unix socket response time         0.000s to /var/run/mysqld/mysqld.sock [DEFAULT]
 data collected                    Mon, 22 Dec 2014 16:50:42

Process 'php5-fpm'
 status                            Running
 monitoring status                 Monitored
 pid                               17033
 parent pid                        1
 uptime                            0m
 children                          2
 memory kilobytes                  13836
 memory kilobytes total            22772
 memory percent                    2.7%
 memory percent total              4.5%
 cpu percent                       0.0%
 cpu percent total                 0.0%
 port response time                0.018s to example.com:80 [HTTP via TCP]
 data collected                    Mon, 22 Dec 2014 16:50:42

File 'nginx-error'
 status                            Accessible
 monitoring status                 Monitored
 permission                        644
 uid                               0
 gid                               0
 timestamp                         Mon, 22 Dec 2014 16:18:21
 size                              0 B
 data collected                    Mon, 22 Dec 2014 16:50:42

Remote Host 'example.com'
 status                            Online with all services
 monitoring status                 Monitored
 icmp response time                0.021s [Echo Request]
 port response time                0.107s to example.com:443 [HTTP via TCPSSL]
 port response time                0.062s to example.com:80 [HTTP via TCP]
 data collected                    Mon, 22 Dec 2014 16:50:42

このデータを使用して、サービスの状態を確認し、有用な統計を確認してください。

トラブルシューティング

問題が発生した場合は、最初に `+ / var / log / monit.log +`にあるMonitのログを確認してください。 これにより、問題の性質に関する詳細情報が得られます。

エラーログエントリの例:

[UTC Dec 22 13:59:54] error    : ICMP echo response for example.com 1/3 timed out -- no response within 5 seconds
[UTC Dec 22 14:10:16] error    : ICMP echo response for example.com 1/3 timed out -- no response within 5 seconds
[UTC Dec 22 15:24:19] error    : 'example.com' failed protocol test [HTTP] at INET[example.com:80] via TCP -- HTTP: Error receiving data -- Resource temporarily unavailable
[UTC Dec 22 15:57:15] error    : ICMP echo response for example.com 1/3 timed out -- no response within 5 seconds
[UTC Dec 22 17:00:57] error    : ICMP echo response for example.com 1/3 timed out -- no response within 5 seconds
[UTC Dec 22 17:49:00] error    : 'example.com' failed, cannot open a connection to INET[example.com:443/API] via TCPSSL

結論

このガイドを完了すると、Ubuntu 14.04でLEMPスタックを監視するようにMonitが構成されているはずです。 Monitは非常に拡張性があり、小規模および大規模ネットワークのあらゆる種類のサービスを監視するために、簡単にカスタマイズまたは拡張できます。

以下は、Monitの追加リンクです。

Related