2015年1月13日火曜日

BIG-IPのモニター(ノード監視)でHTTP(HTTPS)を使ってみる

BIG-IPに限らず多くの負荷分散機では、分散対象ノード(サーバー)のヘルスチェック機能を有していて「モニター(Monitor)」と呼ばれる。ヘルスチェックにてノードダウンを検知した場合は、そのノードに通信を転送しないようにする(分散対象から外す)ことで、業務通信の正常性を担保する機能となる。

モニターには大きく以下の方式がある(カッコ内はBIG-IPデフォルトで存在するモニター名称)。
  • L2 Monior (icmp_gateway) ; pingによる応答有無を確認
  • L3 Monitor (tcp) : 特定ポートに対するTCPコネクション確立可否を確認
  • L4 Monitor (http) : http(それ以外のプロトコルも可)で特定のコマンドを送り、正常性を表すメッセージ応答有無を確認

今回、httpでもモニター設定が必要となり慌てて設定方法を検証したので、備忘として残すことにする。

設定方法

BIG-IPにログインし、「Profile」→「Monitor」→「Create」を選択する。「Parent」に"http"を選択すると以下項目が標準で登録されている。

Send : GET /\r\n
Receive : <空白>

上記は"http://<負荷分散対象ノード>/"のHTMLファイルをGETするコマンドを送ることを意味する。"\r\n"は改行コードを表す。このコマンドを送るとHTMLの中身の文字列が返ってくるが、「Receive」が空白の場合は、応答がとりあえずあればノードは生きていると見なしてしまう。

確かにこれでも監視としては機能するが、L3 Monitorと何ら機能差異が無いので、もう少しチューニングしてみることにする。

文末に記載したF5のKBに調度良いものがあったので、参考に以下を試してみる。これで良い感じはするが、何となくSendに対するRecieveがどのようになっているか直に確認してみたくなった。

Send : GET /index.html HTTP/1.1\r\nHost: host.domain.com\r\nConnection: Close\r\n
Receive : HTTP/1.1 200 OK

HTTPの応答メッセージの確認方法

というわけで、実際にWebサーバーへのコマンド送信を実施し、その応答を確認してみるため、Telnetクライアントを使って確認してみることにした。

TelnetクライアントはWindowsには標準でインストールされていないので、「プログラムと機能」から追加した後、コマンドプロンプトで以下を実行してみる。なお、確認につかっているURLは警視庁のサイトだが、比較的シンプルなサイトを選んだだけであって他意はない。

◆コマンド①:HTMLファイルの中身を表示させる
telnet www.keishicho.metro.tokyo.jp 80
GET /kankatu/event/event.htm  ←入力文字は表示されないのでコピペすると楽

--------出力結果
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<style type="text/css">
~以下略
--------出力結果ここまで


◆コマンド②:HTMLファイルの状態(ヘッダ情報)を表示させる
telnet www.keishicho.metro.tokyo.jp 80
HEAD /kankatu/event/event.htm HTTP/1.0  ←入力文字は表示されないのでコピペすると楽
☆←もう一回Enter

--------出力結果ここから
HTTP/1.1 200 OK   ←HTTP/1.0でコマンドを送ってもHTTP/1.1で返ってくる謎
Date: Tue, 13 Jan 2015 14:11:14 GMT
Server: Apache
Last-Modified: Tue, 13 Jan 2015 05:03:41 GMT
ETag: "c6953e0-5431-50c818be66540"
Accept-Ranges: bytes
Content-Length: 21553
Connection: close
Content-Type: text/html



ホストとの接続が切断されました。
--------出力結果ここまで


◆コマンド③:両方表示させる
telnet www.keishicho.metro.tokyo.jp 80
GET /kankatu/event/event.htm HTTP/1.0  ←入力文字は表示されないのでコピペすると楽
☆←もう一回Enter

※出力結果は省略

◆コマンド④:HTTP1.1で接続
HTTP1.1の場合は、③のようにEnterを2回実施するだけでは、"400 Bad Request"が返ってくるため、コマンドは2行必要になる。

telnet www.keishicho.metro.tokyo.jp 80
GET /kankatu/event/event.htm HTTP/1.1  ←入力文字は表示されないのでコピペすると楽
Host:www.keishicho.metro.tokyo.jp ←"Host:"の後にはどんな文字列でもOKっぽいが、アクセスするURLと合わせると無難

※出力結果は省略(③と同じ)

参考

https://support.f5.com/kb/en-us/solutions/public/13000/600/sol13622.html