前置き
ドメインを立ててその上でサービスを運用する。
そこには複数のサードパーティーのサービスや、負荷分散対応を挟んだりする。
時々予期しない事態(サードパーティーの不具合、負荷分散側の機能アップデート、自分たちのポカとか)で、
知らぬ間に一部のページだけが機能しなくなっていた・・・なんてことがあります。
こうしたケースって、サーバ全体の異常ではないこともあって、
運用側での検知が遅れがちになりやすい気がします。どうしたものかなと。
だから、手間なく準備できる死活監視の仕組みを設けてみようかなと考えてみました。
何を使って監視をするか
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とかにでも載せていこうと思います)