Last-Modified: 2006/8/13
いますぐ実践! Linux システム管理 / Vol.069 / 読者数:867名
こんばんは、うすだです。
おそらく 99% くらいの読者の方はお気づきだと思いますが、記事を書く ときは、先週の記事をコピーして、使い回しています。
ですから、次の週をおやすみすることがあって、最後のあいさつを、
それでは、来々週に、お会いしましょう!
と書き換えたら、次回には、元に戻さなければいけません。
しかし、そのことを忘れてしまいますと、
それでは、来々週に、お会いしましょう!
のまま、毎週発行してしまったりするわけですね。
…ええ、まあ、実は、Vol.065 から今まで、そうなっていました。
仕事の文書でも、日付を古いままで出してしまったりなど、たまにやって しまうことがありますが、仕事でもそうでなくても、最後まで目を通して から出す、ということを、今後は徹底しようと思います。
懺悔がおわりましたので、それでは今週も、はりきってまいりましょう!
今週のお題 - WWW サーバを監視する
前回、Apache のエラーログをメールする方法を、ご紹介しました。
Vol.068 - Apache のエラーログをメールする http://www.usupi.org/sysad/068.html
これで、エラーログを、すばやく知ることができるようになりました。
しかし、WWW サーバ自体が停止してしまったときなど、メールの送信すら
ままならないときには、上記の方法はあまり役に立たなさそうです。
それでは…と、ping コマンドを定期的に実行して、サーバの生存確認を 行う方法を、刹那的に思いつく貴兄がたくさんいらっしゃるのではないか と思います。
% ping -c 1 www.usupi.org > /dev/null 2>&1 \
|| (echo "www.usupi.org is down" | /usr/bin/Mail -s Alert root)
しかし、ping では、そのマシンのカーネルとネットワークの生存確認には
なりますが、WWW というサービスの生存確認にはなりません。
ちゃんと、WWW サーバとして動作していることを、監視したいですよね。
というわけで、今週は、WWW サーバを監視する方法を、ご紹介します。
− − − − − − − − − − − − − − − − − −
つまり、きちんと HTTP でアクセスして、動作することを確認すればいい
ってことですね。
そして、うまくアクセスできないときに、その旨をメールで通知するよう
にしておけば、異常をいち早く知ることができる、と考えられます。
今回、HTTP のアクセスには、wget コマンドを用いようと思います。
wget コマンドは、HTTP でファイルをダウンロードするためのものです。
wget コマンドを使って、WWW サーバの動作確認を行うには、以下のように
実行します。
% wget -O /dev/null http://www.usupi.org/sysad/
--01:27:43-- http://www.usupi.org/sysad/
=> `/dev/null'
www.usupi.org をDNSに問いあわせています... 59.106.23.151
www.usupi.org[59.106.23.151]:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 28,165 [text/html]
100%[====================================>] 28,165 --.--K/s
01:27:43 (227.18 KB/s) - `/dev/null' を保存しました [28165/28165]
ここでは、http://www.usupi.org/sysad/ にアクセスして、www.usupi.org
の WWW サーバが動作していることを、確認しています。
wget は、本来ダウンロードが目的ですが、-O オプションを用いて、出力
ファイルを /dev/null に指定することで、ダウンロードしたファイルを
保存せずに確認だけ行わせています。
ただ、このままではメッセージが冗長ですので、-q オプションで抑制し、 wget コマンドの終了ステータスで判断するようにしてみましょう。
% wget -q -O /dev/null http://www.usupi.org/sysad/ || echo NG
終了ステータスが 0 以外だと、NG と出力されるはずですが、今は正常に
動作していますので、何も出力されません。
試しに、存在しない URL を指定すると、ちゃんと NG と出力されます。
% wget -q -O /dev/null http://a.b.c/ || echo NG
NG
あとは、NG の出力を、メールによる通知に差し替えれば、完成です。
% wget -q -O /dev/null http://www.usupi.org/sysad/ || \
(echo httpd is down. | /usr/bin/Mail -s '[httpd] Alert' root)
上記を実行して、wget コマンドで正常にアクセスできないときに、メール
が root に送られるようになります。
これを cron で定期的に実行すれば、WWW サーバの監視になります。
あ、cron の設定方法は、以下などをご参照ください。
Vol.002 - 簡易バックアップ リローデッド http://www.usupi.org/sysad/002.html
− − − − − − − − − − − − − − − − − −
というわけで今週は…といいたいところですが、これでは wget コマンド
が実行されるたびに、アクセスログに記録されてしまいます。
アクセスログを集計している貴兄にとっては、うれしくないお話です。
ですので、監視のためだけのファイルを用意して、アクセスをログに記録 しないように設定してみましょう。
まずは、どこからもリンクされていない、監視用のファイルを置きます。
以下では、ドキュメントルートが /home/httpd/html だとして、その直下
に keepalive.txt というファイルを置いています。
% cd /home/httpd/html
% touch keepalive.txt
そして、httpd.conf の設定を変更します。
たとえば、今、ログの設定が、以下のようになっているとします。
CustomLog /var/log/httpd/access_log combined
これを、mod_setenvif を使って、以下のように変更します。
<IfModule mod_setenvif.c>
SetEnvIf Request_URI "^/keepalive\.txt$" keepalive
</IfModule>
CustomLog /var/log/httpd/access_log combined env=!keepalive
要求されたファイルが /keepalive.txt のときに、keepalive という環境
変数を設定します。
そして、環境変数 keepalive が設定されていないときだけ、アクセスログ
に記録するようにしています。
あとは、いつものように設定を反映して、確認するだけです。
# /etc/init.d/httpd configtest (必須ではありません)
# /etc/init.d/httpd reload
− − − − − − − − − − − − − − − − − −
以上、WWW サーバを監視する方法について、ご紹介しました。
先週のと併用すれば、たいていの異常には、すぐに気づけると思います。
ただし、メールの宛先を、WWW サーバとなるべく関係のないところにして
おかないと、マシンやネットワークごとおかしくなったときに、メールが
読めなくなる、という状況に陥るかもしれません。ご注意ください。
また、余力のあるかたは、wget コマンドのエラーメッセージもあわせて メールするなど、いろいろカスタマイズしてみてください。
宿題の答え
先週の宿題は、
Apache のエラーログをメールする際に、ある程度集約させて、メール
の数を減らしてください。
でした。
というわけで、alarm を使うことで、Perl でも実現できました。
#!/usr/bin/perl
$addr = $ARGV[0] ? shift:"root";
$tout = $ARGV[0] ? shift:5;
$msgs = "";
$|=1;
$SIG{ALRM} = \&timedout;
while(<>) {
alarm($tout);
$msgs .= $_ unless /File does not exist:/;
print $_;
}
sub timedout {
if($msgs &&
open(MAIL, "|/usr/bin/Mail -s \'[httpd] Error Log\' $addr")) {
print MAIL $msgs;
close MAIL;
}
$msgs = "";
alarm($tout);
}
まず最初に、送信先のメールアドレス($addr)と、タイムアウト($tout)を 決定しています。いずれも、引数で指定されたらその値を使用し、そうで なければデフォルト値(それぞれ root, 5)を使用します。
次に、ログを貯めておく変数 $msgs の初期化と、即座に標準出力へ出力 するための呪文($|=1)を唱えています。
そして、アラーム(SIGALRM シグナル)の発生時に timedout サブルーチン が呼び出されるようにしています。
あとは、無限ループで、標準入力からひたすらエラーログを取得して、例
の "File does not exist:" でない場合に $msgs に追加するとともに、
標準出力に同内容を出力しています。
また、alarm で $tout 秒後に timedout が呼び出されるようにします。
timedout サブルーチンでは、$msgs に何かが入っていれば、メールを送信 します。そして、$msgs を空にし、alarm の再設定を行います。
以上、それだけです。
あとは、httpd.conf に、前回と同様の設定を行います。
ErrorLog "| /usr/local/sbin/errorlogmail.pl >> /var/log/httpd/error_log"
エラーログファイルのパスは、お使いの環境に合わせてください。
(Fedora や Vine の場合、上記でよかったと思います。)
宛先のメールアドレスや、タイムアウト値を変更したければ、ErrorLog の 指定のところに引数を追加してください。
上記の意味がさっぱりわからなければ、まず先週の記事をご覧ください。
Vol.068 - Apache のエラーログをメールする http://www.usupi.org/sysad/068.html
今週の宿題
今週の宿題は、
Anonymous FTP サーバを監視してください。
です。
wget コマンドは、FTP にも対応していますので、簡単にできますよね。
あ、そうそう、ログのことは、今回は気にしないでおきましょう。
あとがき
最近、サランラップ(正確には「食品包装用ラップフィルム」でしょうか) を切らしていたのですが、いろいろイベント続きだったり買い忘れたりと していたため、1週間くらい、ラップなしの生活をしていました。
やってみればわかると思いますが、これが、結構不便なんですよ。
あまった食べものを残しておきたいときや、電子レンジでご飯を温めたい
ときなど、ラップを必要とする状況が、頻繁に訪れます。
今までなにげなく送っていた生活が、ラップにべったり依存していたこと
を、存分に思い知らされました。
しかしながら、にんげんは学ぶことのできる生きものです。
数日過ぎると、ラップなしでもなんとかする術を、見につけます。
あまった食べものはビニール袋に入れたり、レンジで温めるときはラップ
なしで直接やっちゃうなど、なんとでもなることがわかりました。
というわけで、今でもラップなしの生活を…というわけではなく、さすが に今日買ってきました。あー、やっぱりラップがあると便利ですね。
とまあ、結局なにが言いたいかといいますと、すべてが満たされた生活を
過ごすよりも、なにか足りないほうが、にんげんは賢くなれるのではない
か、ということです。
ときどきは、普段使っているもののうちなにかを使わずに、一日過ごして
みようかと思います。(ls を使わないとか…うわぁ不便そう…。)
…ラップごときで、こんなことをちょっと思ってしまいました。
今週も、ここまで読んでいただき、ありがとうございました。
それでは、また『来週』に、お会いしましょう!
「いますぐ実践! Linux システム管理」はこちらです。
メルマガの解除、バックナンバーなども、以下からどうぞ。
https://www.usupi.org/sysad/ (まぐまぐ ID:149633)
その他、作者に関するページは、概ね以下にございます。
https://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
https://twitter.com/kuriking/ (twitter)
https://facebook.com/kuriking3 (facebook)
https://jp.pinterest.com/kuriking/pinterest)
https://www.instagram.com/kuri_king_/ (instagram)