個人開発のサーバー監視、最低限どこまでやればいい?

個人でWebサービスやSaaSを公開すると、意外と悩むのがサーバー監視をどこまでやるかです。

企業が運営する大規模サービスなら、

  • 24時間365日の監視
  • CPU・メモリ・ディスク監視
  • アプリケーション監視
  • ログ監視
  • データベース監視
  • 外形監視
  • セキュリティ監視
  • オンコール対応

など、本格的な監視体制を構築できます。

しかし、個人開発で同じことをしようとすると、監視するだけで疲れてしまいます。

では、個人開発や小規模なWebサービスでは、どこまで監視すればいいのでしょうか。

結論からいうと、

「問題が起きたことに気付けて、原因調査を始められる状態」

をまず作るのがおすすめです。

この記事では、個人開発で最低限設定しておきたい監視を、優先順位ごとに整理してみます。

監視は「全部見る」より優先順位を決める

サーバー監視について調べると、非常に多くの監視項目が出てきます。

CPU使用率、ロードアベレージ、メモリ、ディスク、ネットワーク、プロセス、データベース接続数、レスポンスタイム、エラーレート……。

これらをすべて監視しようとすると、設定するだけでもかなり大変です。

個人開発の場合は、まず次の3段階に分けて考えると分かりやすくなります。

レベル1:サービスが使えるか

最優先です。

ユーザーがWebサービスへアクセスできるかを確認します。

レベル2:サーバーが危険な状態になっていないか

CPUやメモリ、ディスクなどを確認します。

サービス停止につながる前兆を見つけるための監視です。

レベル3:なぜ問題が起きたのか調査できるか

ログやエラー情報などを残して、障害発生後に原因を追えるようにします。

個人開発では、まずこの3段階を押さえておけば、かなり実用的な監視環境になります。

優先度A:まず絶対に見ておきたい監視

最初に設定するなら、以下の監視です。

Webサービスの死活監視

最優先で設定したい項目です。

一定間隔でWebサイトへアクセスし、

  • HTTP 200が返っているか
  • タイムアウトしていないか
  • 5xxエラーになっていないか

などを確認します。

サーバーが起動していても、アプリケーションが正常とは限りません。

そのため、実際にユーザーがアクセスするURLを外部から確認することが重要です。

トップページだけではなく、

  • ログイン画面
  • 重要なAPI
  • ヘルスチェック用URL

などを監視する方法もあります。

ただし最初から大量のURLを監視する必要はありません。

まずはサービスを代表する1つのURLから始めても十分です。

SSL証明書の有効期限

SSL/TLS証明書も監視しておきたい項目です。

自動更新を設定していれば基本的には問題ありませんが、

  • 自動更新処理が失敗していた
  • DNS設定が変わった
  • Webサーバーの設定変更で更新できなくなった

といった理由で、更新されない可能性があります。

証明書期限が切れると、ブラウザに警告が表示されるため、ユーザーへの影響も大きくなります。

期限切れの直前ではなく、ある程度余裕を持って通知されるようにしておくと安心です。

ディスク使用率

個人開発では意外と見落としやすいのがディスク容量です。

たとえば、

  • アクセスログ
  • エラーログ
  • Dockerログ
  • アップロードファイル
  • バックアップファイル
  • 一時ファイル

などが増え続けることで、いつの間にかディスクがいっぱいになることがあります。

ディスク容量がなくなると、

  • ログが書き込めない
  • データベースが正常に動かない
  • アプリケーションがエラーになる

など、さまざまな問題につながります。

そのため、ディスク使用率は早い段階から監視しておいた方がいい項目です。

優先度B:できれば見ておきたい監視

次に設定したいのが、サーバーリソースの監視です。

CPU使用率

CPU使用率が一時的に高くなること自体は珍しくありません。

問題なのは、

高い状態が長時間続いている場合

です。

たとえば、

  • 想定以上にアクセスが増えた
  • 重い処理が実行され続けている
  • バックグラウンドジョブが暴走している
  • プログラムに問題がある

といった可能性があります。

単純に「80%を超えたら即通知」とすると通知が多くなりやすいため、

一定時間以上、高い状態が続いたら通知する

といった設計の方が実用的です。

メモリ使用量

メモリ不足もWebサービス停止の原因になります。

特に、

  • PHP-FPM
  • MySQL
  • Redis
  • Dockerコンテナ
  • バックグラウンドワーカー

などを同じサーバーで動かしている場合、少しずつ使用量が増えていくことがあります。

メモリが不足すると、プロセスが強制終了されることもあります。

CPUと同じく、瞬間的な値よりも継続的な変化を見る方が重要です。

レスポンスタイム

Webサイトが表示されていても、

「ページ表示に15秒かかる」

のであれば、正常に動いているとは言いにくい状態です。

レスポンスタイムを監視していると、

  • データベースが遅くなっている
  • 外部APIの応答が遅い
  • サーバーリソースが不足している
  • アクセスが急増している

といった問題に気付ける場合があります。

死活監視と一緒に確認すると、よりサービスの状態が分かりやすくなります。

優先度C:サービスが成長したら追加したい監視

最初から必須ではありませんが、利用者が増えてきたら追加したい項目もあります。

アプリケーションエラー

LaravelなどのWebアプリケーションなら、例外やエラーを記録しているはずです。

500エラーが頻発している場合、

Webサイト自体は表示できていても、特定の機能だけ壊れている可能性があります。

アクセス可能かどうかだけでは分からないため、サービスが成長してきたらアプリケーションエラーも確認したいところです。

データベース

データベースについても、

  • 接続できるか
  • CPU負荷
  • 接続数
  • ストレージ
  • 遅いクエリ

など、さまざまな監視があります。

ただし、個人開発の初期段階で細かく監視しすぎる必要はありません。

まずは、

データベースの問題によってWebサービスが停止していないか

を検知できれば十分です。

アクセス数やデータ量が増えてきてから、より詳細な監視を追加していけばよいでしょう。

バックグラウンドジョブ

メール送信、データ集計、外部API連携などにキューを使っている場合は、

「Web画面は正常だけれど、裏側の処理だけ止まっている」

という状態が発生することがあります。

サービスの中でバックグラウンド処理の重要度が高くなったら、

  • ワーカーが動いているか
  • ジョブが大量に溜まっていないか
  • 失敗ジョブが増えていないか

といった監視も検討します。

通知先は増やしすぎない

監視を設定したら、次に考えるのが通知です。

メール、Slack、Discord、LINEなど、さまざまな通知方法があります。

しかし、通知先を増やしすぎると管理が大変になります。

個人開発なら、

自分が確実に見る場所を1つか2つ

に絞った方が運用しやすいです。

重要なのは通知手段の数ではなく、

異常が発生したら自分が気付くこと

です。

「警告」と「障害」を分ける

監視を始めると、すべての通知が同じ重要度ではないことに気付きます。

たとえば、

ディスク使用率70%

と、

Webサービスが完全に停止

では緊急度がまったく違います。

そこで、

警告

今すぐサービス停止ではないが、確認した方がいい状態

障害

ユーザーへの影響が発生している状態

というように分けると管理しやすくなります。

たとえば、

  • CPUが少し高い → 警告
  • ディスク容量が残り少ない → 警告
  • SSL期限が近い → 警告
  • HTTP 500が継続 → 障害
  • Webサイトに接続できない → 障害

といったイメージです。

監視のために運用が複雑になっては意味がない

個人開発では、監視そのものを目的にしないことも大切です。

監視ツールをいくつも導入して、

  • Aサービスで死活監視
  • Bサービスでログ監視
  • AWSでメトリクス監視
  • Cサービスでエラー監視
  • Dサービスで通知

となると、今度は監視環境そのものを管理する必要が出てきます。

もちろん、大規模サービスなら専門ツールを組み合わせる価値があります。

しかし個人開発では、

必要な情報をできるだけ簡単に確認できること

も重要です。

私なら最初はこの7つを見る

個人で新しいWebサービスを公開するとしたら、まずは次の7項目から始めます。

  1. Webサービスへアクセスできるか
  2. HTTPエラーが発生していないか
  3. レスポンスが極端に遅くないか
  4. SSL証明書に問題がないか
  5. ディスク容量が不足していないか
  6. CPU・メモリに異常がないか
  7. 問題発生時に確実に通知されるか

その後、サービスの構成に応じて、

  • データベース
  • キューワーカー
  • 外部API
  • アプリケーションエラー
  • AWSコスト

などを追加していきます。

最初から完璧を目指すより、サービスの成長に合わせて監視項目を増やした方が現実的です。

Mimizuでも「必要なものを簡単に見る」を目指しています

私自身も複数のWebサービスやAWS環境を管理しているため、

監視項目を増やし続けるより、

「今、自分のサービスに問題があるのか」

をすぐ確認できる方が便利だと感じています。

そこで現在、インフラ監視サービス Mimizu(ミミズ) を開発しています。

目指しているのは、専門のインフラ担当者だけが使う巨大な監視システムではなく、

個人開発者や小規模なサービス運営者でも、

  • サービスが正常か
  • 問題が起きていないか
  • 対応が必要なことがあるか

を分かりやすく把握できるサービスです。

Mimizu
https://www.mimizu.dev/

開発状況や、実際のサーバー監視・AWS運用については、今後もこのブログで紹介していきます。

まとめ

個人開発のサーバー監視では、最初から大規模サービスと同じ監視環境を作る必要はありません。

まずは、

サービスが使えるか

サーバーが危険な状態になっていないか

問題が起きたときに調査を始められるか

の3つを意識すれば十分です。

特に、

  • 死活監視
  • SSL証明書
  • ディスク
  • CPU
  • メモリ
  • レスポンスタイム
  • 通知

あたりから始めると、最低限の監視環境を作りやすくなります。

監視は多ければ多いほど良いわけではありません。

「異常が起きたときに気付き、必要な対応を始められること」

が一番重要です。

コメントする