簡単なWebサーバーの監視をする

今回は Web サーバーが公開する URL にリクエストを送り、死活監視を行うジョブフローを作成します。


動作確認環境

本稿は、以下の環境で検証しています。

ソフトウェア バージョン
Kompira Enterprise 1.5.5.post7
OS CentOS 7.8.2003

または

ソフトウェア バージョン
Kompira Enterprise 1.6.2.post4
OS CentOS 8.2.2004

または

ソフトウェア バージョン
Kompira Enterprise 1.6.8
OS CentOS Stream 8

以下のような処理の流れを想定しています。

  • 指定の URL にリクエストを送信し、応答がなければエラーを表示
  • HTTP のステータスコードが200以外の場合にはエラーを表示
  • 上記以外の場合には正常であると表示

まず WEB サーバーにリクエストを送信する方法ですが、以下のような Kompira Enterprise の組み込み関数 urlopen() を使います。引数で指定した url に対して、HTTP リクエストを送信し、結果を取得します。

urlopen(url [, user, password, data, params, files, timeout, encode, http_method, verify, quiet, headers, cookies, charset, binary, proxies])

[ ] 内の引数は省略可能です。各引数の意味は以下の通りです。

user 、password Basic 認証によるアクセスを行います。
data 送信データを辞書型の値として格納し、HTTP の POST リクエストを送信できます。
params 辞書を渡すと URL のクエリ文字列として展開されます。
例えば urlopen(url=’http://example.com‘, params={key1=’value1’,key2=’value2’}) とすると、
実際にアクセスする URL は http://example.com?key1=value1&key2=value2 となります。
files アップロードするファイルを渡すことができます。ファイルは name と data というフィールドを持つ辞書、ファイル名とコンテンツのリスト、Kompira Enterprise サーバー上のファイル名、または添付ファイルフィールドのいずれかの形式で指定することができます。
例: files={file={name=’filename’, data=’content’}}
timeout タイムアウトするまでの時間を秒単位で指定します。
encode エンコードタイプとして “json” を指定することができます。
data が指定され encode が “json” のとき、HTTP リクエストの Content-Type ヘッダには自動的に application/json が設定されます。
encode 引数を省略した場合、送信データは application/x-www-form-urlencoded 形式でエンコードされます。
http_method HTTPリクエストのメソッドを ’GET’ 、‘POST’ 、‘PUT’ 、’DELETE’ 、‘HEAD’ のいずれかから指定します。
http_method を省略した場合、data が指定されていない場合は GET メソッド、指定されている場合は POST メソッドとなります。
verify true を指定すると、指定した URL が https アクセスである時に SSL 証明書のチェックを行います。
不正な SSL 証明書を検出するとurlopen ジョブはエラーになります。verify のデフォルト値は false です。
quiet true を指定すると、https アクセスした際に表示される警告メッセージを抑止します。
headers HTTP リクエストに設定するヘッダ情報を、辞書型の値で渡すことができます。
cookies サーバーに渡すクッキーを辞書型の値で渡します。
charset レスポンスとして期待する文字コードを指定することができます。
binary true を指定すると、Content-Type によらずコンテンツをバイナリとして扱います。
proxies HTTP リクエスト送信時のプロキシサーバー情報を辞書型の値で渡すことができます。
例: urlopen(‘http://www.kompira.jp’, proxies={‘http’: ‘http://10.10.1.10:3128’, ‘https’: ‘http://10.10.1.10:1080’})

urlopen()でアクセスに成功した場合の結果は、以下の要素を持つ辞書で返されます。code には HTTP のステータスコードが、body にはレスポンスの内容が格納されています。

フィールド名 説明
url レスポンスの URL
code 結果ステータスコード
version HTTPバージョン(HTTP 1.1 なら 11 という数値になります)
text レスポンスの内容 (エンコード情報をもとにレスポンス本文をテキストにデコードしたもの。ただし、バイナリコンテンツの場合は空文字)
content レスポンスの内容 (バイナリのままのレスポンス本文)
body レスポンスの内容 (コンテンツがバイナリであると判断したときは content と同じ値になり、テキストであると判断したときは text と同じ値)
encoding エンコード情報
headers レスポンスに含まれるヘッダ情報 (辞書型)
cookies サーバーから渡されたクッキー値 (辞書型)
history リダイレクトがあった場合にその履歴情報 (リスト型)
binary バイナリコンテンツであるかの真偽値

これを用いて、Web サーバーにリクエストを送信するのは以下のようなコードになります。

| url = "http://www.kompira.jp/" |

urlopen(url)

続いて結果を判断して表示の切り替えを行います。
条件分岐は if ブロックを用いて行います。

{ if (条件式) |
  then: 
    (条件が真の場合の処理)
  else:
    (条件が偽の場合の処理)
}

urlopen() を実行した際、リクエストの送信に成功した場合には $STATUS が0に、失敗した場合は $STATUS が0以外になります。

よって、まずは urlopen() 自体が成功したかどうかで分岐する処理をします。

| url = "http://www.kompira.jp/" |

urlopen(url) =>
{ if $STATUS != 0 | 
  then:
    print("異常が検出されました")
  else:
    print("正常です")
}

具体的に失敗する場合は、urlopen() に指定したホスト名や IP アドレスが間違っていたり、ネットワークが接続できなかったということが原因であると考えられます。

さて、今回は「HTTP の応答コードが200以外の場合にはエラーを表示」としたいので、このコードだけでは十分ではありません。

ここに HTTP リクエストのステータスコードが200であるかどうかを確認する処理を追加してみましょう。

if ブロックで追加条件を指定する場合には elif 節を用います。

{ if (条件式) |
  then: 
    (条件が真の場合の処理)
  elif (追加条件式):
    (条件が偽、かつ追加条件が真の場合の処理)
  else:
    (条件が偽、かつ追加条件も偽の場合の処理)
}

これを用いて、HTTP のステータスコードが200以外の場合は異常とします。urlopen() の結果は $RESULT に辞書型で格納されており、”code” というキーで参照できます。

| url = "http://www.kompira.jp/" |

urlopen(url) =>
{ if $STATUS != 0 | 
  then: 
    print("異常が検出されました")
  elif $RESULT.code != 200:
    print("異常が検出されました。エラーコードは %{code}" % $RESULT)
  else:
    print("正常です")
}

HTTP リクエストに対する応答が正常でなかったときは、$RESULT.code が200以外になります。

例えば、存在しない URL パスを指定していたり、Web サーバー側で何らかのトラブルが発生している場合等があります。

本稿では HTTP GET リクエストを送信するのに urlopen() を使用しました。上記ではレスポンス中のステータスコードを確認するだけにとどまっていますが、サイトのコンテンツ内容の取得はもちろん、ファイルのダウンロードや外部の REST API 呼び出しなど、urlopen() は様々な場面で使用することができます。

TOP