サーバーヘルスチェックの手法と最新ツール

ヘルスチェックとは、ウェブサイトのロードバランサーやWebサーバーがエラーを返さないか監視することです。サーバー側が把握しているステータスコードである4xx系のエラーと、サーバー側が把握していないエラーである5xx系のエラーに大別されます。

問題が起きる原因

1.ロードバランサーで問題が起きている場合

AWSなどのロードバランサーを使っていると、謎の502エラーに悩まされることがあります。これはロードバランサーに問題がある可能性があります。本当にWebサーバーなどでなく、ロードバランサー側のエラーかはログを見ればわかります。502エラーをWebサーバーが返していなかったら、ロードバランサーのエラーというわけです。

2.Webサーバーやアプリケーションサーバーで問題が起きている場合

Webサーバーがポートなどの設定を間違えていたり、アプリケーションサーバーが停止しているときは502エラーになります。

アプリケーションサーバーがエラーを返している場合、代表的なステータスコードは500ですが、502以外の4xx系、5xx系のエラーはアプリケーションサーバーのエラーを疑ったほうがよいでしょう。nginxなどのWebサーバーで問題が起きているのか、Rails、C#の.NETなどのアプリケーションサーバー側で問題が起きているのかは、ログを見れば確かめることができます。

例:AWSのヘルスチェック

例として、AWSのヘルスチェックを取り上げてみますが、他のクラウドサービスの場合も同様です。Cloud Watch に5xxエラーの許容値などを設定して、メールで通知するようにするというものです。欠点としては、通知に気づかないということが挙げられます。

この場合、Slackに通知するようにしてみてはいかがでしょうか?Slack bot に話しかけるだけでヘルスチェックの設定がSlack上で完結するツールを私たちは作っています。

"@Lapis set up health check: https://..."(現在英語のみに対応しています)と話しかければ、ヘルスチェックをセットしてくれます。これでエラーステータスが返ってきたときには自動で@channel に通知が飛ぶので、エラーが起きた時の初動が早くなります。

Add to Slack

Lapis の他のヘルスチェックと違うところ

いままでのヘルスチェックはステータスコードのエラーを見るものでしたが、サーバーが重くなっていて、レスポンスが遅くなっているときにも通知を受け取りたいということはないでしょうか?

Lapisはデフォルトで対応しています。例えば"@Lapis notify us when the response time is more than 3 sec." と話しかければ、レスポンスタイムが3秒以上の時にメッセージを受け取ることができます。

付録:ステータスコード一覧

400: Bad Request

Webサーバー側が間違った形式のレスポンスを返している

401: Unauthorized

アクセスを承認するシステムを構築しているが、そのシステムで認証できなかった

403: Forbidden

アクセス元を認証するシステムによりブロックされた

405: Method not allowed

HTTPメソッドとして許されていないメソッドだった

408: Request timeout

サーバーが時間内に応答しなかった

413: Payload too large

リクエストが大きすぎる

414: URI too long

リクエストのURLが長すぎる

500: Internal server error

アプリケーションサーバーのコーディングエラーとしてよくあるエラー

501: Not implemented

POSTリクエストなど、想定していないメソッドが送られた時のエラー。本来は405: Mehod not allowed を返すべきです

502: Bad gateway

ロードバランサーがエラーを起こしているか、Webサーバーの設定が間違っているか、アプリケーションサーバーが停止している

503: Service unavailable

サーバーが停止している

504: Gateway timeout

ドメインを新しく購入した際に、DNSの解決がまだの時に多く発生します

505: HTTP version not supported

WebサーバーによってサポートされたHTTPバージョンでない場合