インフラ運用中の障害に対する切り分け方法に関する記事です。これまで SSH でログイン(こちら)し、top で簡単な状況分析(こちら)をするところまでを説明しました。
今回はさらに踏み込んでで障害解析をしてみます。
その3:とにかく telnet でポートを叩いてみる(IP と TCP レベルの確認)
telnet でそのサーバにアクセスしてみます。障害は発生箇所により様々なポートになりますが、telnet は通常 telnet 以外のポートでも通信(対話も)可能ですので非常に有用です。
もちろん障害種別によりポートは異なります。一般的ですが整理してみました。
例えば、http による telnet 接続では以下のようにコマンド一つでも http 経由のコンテンツ取得が可能かどうかを判断することができます。
telnet による http の対話例
$ telnet www.example.com 80
Trying 192.0.32.10…
Connected to www.example.com (192.0.32.10).
Escape character is '^]'.
GET /
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<TITLE>Example Web Page</TITLE>
</HEAD>
<body>
<p>You have reached this web page by typing "example.com",
"example.net","example.org"
or "example.edu" into your web browser.</p>
<p>These domain names are reserved for use in documentation and are not available
for registration. See <a href="http://www.rfc-editor.org/rfc/rfc2606.txt">RFC
2606</a>, Section 3.</p>
</BODY>
</HTML>
Connection closed by foreign host.
上記のコマンド例の中で telnet コマンドの後に入力を行ったのは “GET /” だけになります。"/" を指定することで http://www.example.com/ を指定したことになります。
これだけでも http サービス(apache 等)が正常に稼働しているか、そもそも接続可能なのかを判別することができます。
telnet 接続は接続する環境が重要
また実行する環境も重要です。上記の場合 DNS 指定(www.example.com)ですので外部から接続していることになり実際のユーザが接続しているのと同等の効果が期待できますがこれで接続できない場合もあります。
接続できない場合は www.example.com(ここは自分が提供している DNS と置き換えてください)に直接 SSH 等でログインし、“telnet localhost 80” 等を実行してみて下さい。
外部からの接続に失敗し、localhost つまり自分自身へのログインに成功するのであれば通信経路に問題があります。localhost 指定での telnet 接続でも失敗するようであれば http サービス側に問題があります(通常は再起動で復旧)。
ここまでくればもうほとんどの障害切り分けは完了しています。やり方はこれまで説明してきた通り多数ありますが自分の中で手順を確立するのが一番のように感じます。早期の障害復旧を目指して頑張って下さい。