2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ドメインの死活監視 〜死活判定編〜

Last updated at Posted at 2019-06-26

前置き

ドメインを立ててその上でサービスを運用する。
そこには複数のサードパーティーのサービスや、負荷分散対応を挟んだりする。

時々予期しない事態(サードパーティーの不具合、負荷分散側の機能アップデート、自分たちのポカとか)で、
知らぬ間に一部のページだけが機能しなくなっていた・・・なんてことがあります。

こうしたケースって、サーバ全体の異常ではないこともあって、
運用側での検知が遅れがちになりやすい気がします。どうしたものかなと。

だから、手間なく準備できる死活監視の仕組みを設けてみようかなと考えてみました。

何を使って監視をするか

curlはどうでしょうか。

誰でも手軽に対象との通信状態を検証できる便利なコマンド。
これで通信状態をチェックして、バッチ処理にまで落とし込んでみると良さそうです。

何をもって「死」「活」と判断するか

コンテンツの中身まで監視するとやることが非常に多くなるので、
シンプルに「リクエストに対するHTTPステータス」で判断するのがよろしいかと。

ざっくり判断であれば、以下のようになると思います。

ステータス 概要 死活判断
2xx系 リクエストは通った。
3xx系 リクエストは通り、別ページ等への遷移が発生した。 死 or 活
4xx系 リクエストした先は存在しないページだった。 死 or 活
5xx系 リクエストをサーバが処理できなかった。

2xx系は「活」。

3xx系も基本は意図した設計を行ってのリダイレクトなので、基本は「活」です。
ただ、こちらの想定と異なるリダイレクトがあったりすると、そこは「死」と見るべきです。

4xx系は見る場所によりますね。
存在しないコンテンツのリクエストでの4xxなら「活」だと思いますが、
あるはずのコンテンツのリクエストが4xxなら、それは「死」ですよね。

5xx系になると理由はどうあれ、それは「死」ですよね。

こんな具合に、HTTPステータスを見るだけでも、
ざっくりとした死活監視ならまぁ問題は無いかなと考えました。

curl でHTTPステータスだけを取得しよう

普通にcurlを叩いてみます。

curl https://www.google.co.jp
<!doctype html><html itemscope="" …略

コンテンツをまるっととってくる。情報量が多すぎます。
欲しいのは、HTTPステータスだけですのでオプション指定で情報を削っていきます。

まず、ファイル出力時の進捗状況はいらない。→ -s
続いて、SSL接続での証明書エラーはスキップしたい。→ -k
あと、レスポンスボディもいらない。→ -o /dev/null
だけど、ステータスコードだけは取得したい。→ -w '%{http_code}\n'

curl -sk https://www.google.co.jp -o /dev/null -w '%{http_code}\n'
200

これで、HTTPステータスだけ取得できました。

curlをシェルスクリプトに組み込む

死活監視の対象にしたいURLは、テキストでダダ書きにしておきます。
⇨ url.txt

https://google.co.jp
https://www.google.co.jp
https://www.google.co.jp/aaa

上記テキストはシェルスクリプトの同一なりに置いて、
以下のシェルスクリプトを準備しました。
⇨ domain.sh

while read url
do
    status=$(curl -sk "${url}" -o /dev/null -w '%{http_code}\n')
    printf "URL:%s / STATUS:%s\n" $url $status

    if [ ${status:0:1} = 2 ] ; then
        echo "OK"
    elif [ ${status:0:1} = 3 ]; then
        echo "OK"
    elif [ ${status:0:1} = 4 ]; then
        echo "WARNING"
    elif [ ${status:0:1} = 5 ]; then
        echo "ALERT"
    fi
done < ./url.txt

URLの一覧ファイルを読み込んで、curlで回していきます。
一旦、2xx はOK、3xx も(思うところはあるが今は)OK、4xx はWARNING、5xx はALERTとしています。
実行結果は以下となりました。

URL:https://google.co.jp / STATUS:301
OK
URL:https://www.google.co.jp / STATUS:200
OK
URL:https://www.google.co.jp/aaa / STATUS:404
WARNING

↑ひとまず期待動作だと思います。

この結果を「判定結果を誰かに伝える処理」まで準備できれば、
ドメインの死活監視として、最低限は機能してくれそうです。

あと、3xx系、4xx系は見るURL次第では「死」にも「活」にもなりますから、
そこは考慮できる実装に見直したいです。例外処理ももう少し足していかないと・・・。

やるべきことはまだまだありそうです。続きはまた次回。
(コードが全て仕上がったらgithubとかにでも載せていこうと思います)

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?