ウェブサーバのHTTPリスポンスを定期的に監視する

ウェブサーバが落ちてたらgmailで通知してくれる
----------------------------------------
そんなスクリプトを書きました。
**（ただし、パソコンが起動している間しか確認しません。だいたい1日中起動しているPC、あるいは別サーバ上で定期的に実行するといいかと。）**

gmail以外でも、SMTPのサーバとポート番号を編集したら使えます。

ウェブサーバが気づいたら落ちてる、なんてこと、あってはいけないんですが、たまに起きます。
Zabbixとか導入する気力もリソースもないというか、ちょっと面倒なので、今回は家のPCから定期的にチェックすることにしました。
ついでに、ローカルストレージに結果を記録するようにしました。


スクリプト
==============

下のスクリプトでは、HTTP GETを送信して、問題が発生したら、
メールで通知してくれる Python スクリプトです。

Python3.3, Windows で動作確認しました。
Macや、違うPythonバージョンの場合には、適時修正してください。

（スクリプト実行でいかなる損害があったとしても、一切責任を負いませんので、各自の責任の上、利用してください。）



```py3:webtest.py
#!/usr/bin/python
# coding: UTF-8
# ウェブサーバ 監視ツール
import http.client,datetime,os

#============設定項目==============
# Gメールのアカウント
gmail_sender = 'あなたのあかうんと@gmail.com'
# Gメールのパスワード
gmail_passwd = 'あなたのぱすわーど'
# エラーメール送信先
gmail_to = 'そうしんさき＠メールアドレス'
# メールの件名
mail_subject =  'サーバーエラーが発生しています'
#チェックするサーバ
servers = ("www.あなたのさいと１.com","www.あなたのさいと２.net")
# ログ保存先ディレクトリ(相対パス)
log_dir = "webtestlog"
#=================================

import smtplib
from email.mime.text import MIMEText

# メール送信
def sendmail(data):
	global gmail_sender,gmail_passwd,gmail_to,mail_subject
	TEXT = data
	# サインイン
	server = smtplib.SMTP('smtp.gmail.com', 587)
	server.ehlo()
	server.starttls()
	server.login(gmail_sender, gmail_passwd)

	message = MIMEText(data,"plain","UTF-8")
	message["Subject"] = mail_subject
	message["From"] = gmail_sender
	message["To"] = gmail_to

	try:
	    server.sendmail(gmail_sender, [gmail_to], message.as_string())
	    print ('email sent')
	except Exception as e:
		print (e)
		print ('error sending mail')

	server.quit()


result = ""
error_detected = False


#結果のフォーマット。ここをカスタマイズすれば、もっと詳しい情報を追記したりとかできる。
def format_result(address,response):
	return address +"  "+ str(response.status) + "   " + response.reason

#ルート・ディレクトリをチェックする
def checkroot(address):
	global result,error_detected
	conn = http.client.HTTPConnection( address )
	try:
		conn.request( "GET", "/" )
	except:
		result = result + address + " CANNOT GET\n"
		error_detected = True
		return
	response = conn.getresponse()
	if response.status != 200:
		error_detected = True
	result = result + format_result(address,response) + "\n"
	conn.close()

# ここですべてのサーバをチェックする
for each in servers:
	checkroot(each)


if not os.path.isdir(log_dir):
	os.mkdir(log_dir)

now = datetime.datetime.now()
# 時間情報を埋め込む
result = str(now) + "\n" + result
# レスポンスの記録
filename = log_dir+"\log_"+now.strftime("%y-%m-%d")+".txt";
f = open(filename, 'a') # 追記モード
f.write(result) # 結果
f.close()


#エラーがあればメール送信
if error_detected:
	sendmail(result);

```

実行結果
-----------
今はあえてURL間違えてエラー発生させてますが、500エラーとか発生したり、HTTP GET 実行時にエラーが発生したりしたら
このようにメールが来ます。

![result.png](https://qiita-image-store.s3.amazonaws.com/0/10098/a364f856-cd20-21f5-5549-284d2d808012.png)


バッチファイル作成
==================
pythonスクリプトは直接は実行できなかったと思うので、バッチファイルを作成します。
（webtest.pyスクリプトは、C:\bin に置いてあるとします。）

```bat:webtest.bat
cd C:\bin
python webtest.py
```

cdしておかないと、webtest.py が見つからないよ！というエラーが発生しますので、ご注意を。


スケジューラ
=============

上のスクリプトを１度実行してみて、正しく動いたら次はスケジュール化。
今回はWindowsのタスクスケジューラで定期的に実行することにしました。

コントロールパネル > "スケジュール"　で検索 > タスクのスケジュール

![n.png](https://qiita-image-store.s3.amazonaws.com/0/10098/04749b18-0ba4-c9cd-42b4-25badd4cbc47.png)



タスクスケジューラが起動したら、「基本タスクの作成」で、適当に作ります。
トリガーは「毎日」にしておいてください。（あとで短時間に変えれます）
プログラムを選択するところで、先のバッチファイルを選択します。


X分ごとに確認
-------------
トリガーを編集します。
![fsa.png](https://qiita-image-store.s3.amazonaws.com/0/10098/a61ede6d-b68e-4345-9273-398deda5afb5.png)




バックグラウンドにする
------------------------
毎回ちらっとコマンドプロンプトが表示されるのは、うるさいので非表示にします。

プロパティ画面で、「ユーザーまたはグループの変更」> SYSTEM と入力してOK
「タスク実行時に使うユーザーアカウント：」が「NT AUTHORITY\SYSTEM」 とかになってればOKです。

![aa.png](https://qiita-image-store.s3.amazonaws.com/0/10098/78b9ce6e-43e0-50b5-c510-4e57cc78d111.png)