
|
[バックナンバーのトップへ] [Linux システム管理のトップへ] いますぐ実践! Linux システム管理 / Vol.068 / 読者数:857名こんばんは、うすだです。 最近、酷使しているノートパソコンが、 サスペンドしてもすぐリジュームするようになってしまいました。 サスペンドして収納したはずが、勝手にリジュームするために、 取り出すともわーんと熱くなっていて、がっかり感が漂います。
ですので、長時間の移動の際には、いちいちシャットダウンしています。 しかし、最初にサスペンドやハイバネーションを考えたひとって、 すごいですよね。今、その便利さを実感しています。
下痢で苦しいときに、かつての健康なじぶんが幸せだったことに気づく、
みたいな感じに似ています。 まあ気をとり直して、それでは今週も、はりきってまいりましょう! 今週のお題 - Apache のエラーログをメールするインターネットにおけるたくさんのサービスの中でも、WWW は、 最も重要なものの範疇に含まれると言っても、まったく過言ではないと思います。 その WWW サーバが正しく機能していないと、ホームページが正常に見られなかったり、 ユーザが本来受けられるべきサービスを受けられなかったりといった、 たいへん困った状態に陥ってしまいます。
そんな状態を、あるいはその前兆を、
システム管理者はいち早く知るべきではないかと思います。 そんなときは、とりあえずメールで通知させることが、王道ではないかと思います。 ログの確認よりもメールのチェックのほうが、実行する頻度が高いですよね。 というわけで今週は、WWW のエラーログをメールでお知らせする方法を、 ご紹介したいと思います。 Linux で WWW と言えば Apache しかないよね、と勝手に断言して、 今週のお題を進めさせていただきます。
さて、Apache では、アクセスログもエラーログも、
プログラムに渡して処理することが可能です。
今回作成するスクリプトのパスは、
/usr/local/sbin/errorlogmail.pl としましょう。 ErrorLog "| /usr/local/sbin/errorlogmail.pl" これで、エラーログが、errorlogmail.pl の標準入力に渡されます。
次に、肝心の errorlogmail.pl の内容です。
#!/usr/bin/perl
use strict;
my $addr = $ARGV[0] ? shift:"root";
while(1) {
my $r = sysread(STDIN, my $m, 4096);
if($m) {
if(open(MAIL, "|/usr/bin/Mail -s \'[httpd] Error\' $addr")) {
print MAIL $m;
close MAIL;
}
}
if($r <= 0) {
last;
}
}
最初に、メールアドレス($addr)を決定します。引数があればそれを使いますが、 なければデフォルト値(root)を用います。
次が、無限ループです。 …という簡単なものです。 上記の errorlogmail.pl を作成し、実行権をつけて、httpd.conf を変更したら、 反映してみましょう。 # /etc/init.d/httpd configtest # /etc/init.d/httpd reload いきなり試すのが不安な貴兄は、 まずコマンドラインで試してみてもよいかもしれません。 # echo test | /usr/local/sbin/errorlogmail.pl いずれにしましても、root 宛にメールが届いたら、おそらく成功です。 宛先を root 以外に指定したければ、errorlogmail.pl の引数に、 メールアドレスを指定してください。 ErrorLog "| /usr/local/sbin/errorlogmail.pl usu@usupi.org" こうすると、root ではなく、usu@usupi.org に送られます。
これでめでたしめでたし…と言いたいところですが、
ログファイルに記録されなくなってしまいました。
#!/usr/bin/perl
use strict;
$|=1; # 追加
my $addr = $ARGV[0] ? shift:"root";
while(1) {
my $r = sysread(STDIN, my $m, 4096);
if($m) {
print $m; # 追加
if(open(MAIL, "|/usr/bin/Mail -s \'[httpd] Error\' $addr")) {
print MAIL $m;
close MAIL;
}
}
if($r <= 0) {
last;
}
}
コメントに『追加』とある部分が、追加したところです。 変更したら、ErrorLog を、以下のように設定しましょう。 ErrorLog "| /usr/local/sbin/errorlogmail.pl >> /var/log/httpd/error_log"
ログファイル(/var/log/httpd/error_log)に書き込むため、
リダイレクトを追加します。
(追加書き込みなので >> としてます。> はまずいです。) 今度こそ、めでたしめでたし…と言いたいところですが、 普段からエラーログにたくさん出力されている環境では、このままですと、 メールが大量に送られてきてしまいます。 その中でも多いのが、こういうやつではないかと思います。 File does not exist: /home/httpd/html/robots.txt
ここでは、File does not exist 云々というエラーログを、
ログファイルだけに記録して、メールでは通知しないようにしてみましょう。
#!/usr/bin/perl
use strict;
$|=1;
my $addr = $ARGV[0] ? shift:"root";
while(1) {
my $r = sysread(STDIN, my $m, 4096);
if($m) {
print $m;
next if $m =~ /File does not exist:/; # 追加
if(open(MAIL, "|/usr/bin/Mail -s \'[httpd] Error\' $addr")) {
print MAIL $m;
close MAIL;
}
}
if($r <= 0) {
last;
}
}
コメントに『追加』とある部分が、今回追加したところです。 以上、Apache のエラーログをメールする方法を、ご紹介しました。 Apache の再設定(reload)や再起動(restart)などの際にも、 メールが送信されますので、けっこう便利なんじゃないかと思います。
とはいえ、このままでは、1行メールがたくさん送られてきちゃいます。 宿題の答え先週の宿題は、 tcp_wrapper を使って、不正なポートのアクセスを検出しましょう。 でした。
ここでは、telnet に対する不正アクセスの検出を、行ってみます。 xinetd の場合は、以下の内容の /etc/xinetd.d/telnet を用意します。
# default: off
# description: telnet server
service telnet
{
disable = yes
flags = REUSE
socket_type = stream
wait = no
user = root
server = /bin/cat
}
ミソは、server に /bin/cat を指定しているところ…でしょうか。 # chkconfig telnet on inetd の場合は、/etc/inetd.conf に以下を追加(あるいは変更)します。 telnet stream tcp nowait root /usr/sbin/tcpd /bin/cat そして、inetd に知らせます。 # kill -HUP `cat /var/run/inetd.pid` それから、いずれの場合も、/etc/hosts.deny に、以下を追加します。 cat: ALL これで、telnet へのアクセスがあると、syslog に記録されるようになります。 (/var/log/messages や /var/log/secure などをご覧ください。) 他のサービスに対しても同じ設定を追加する際には、 同様に /bin/cat を指定すれば、hosts.deny を変更する必要がなくなります。 今週の宿題今週の宿題は、 Apache のエラーログをメールする際に、ある程度集約させて、メール の数を減らしてください。 です。
今週のお題の延長です。 Apache/2.2.0 (Fedora) configured -- resuming normal operations Digest: generating secret for digest authentication ... Digest: done
というエラーログが、1行につき1通、つまり3通のメールで通知されます。 …というのを、実は、本題でやるつもりだったのですが、 Perl の select がソケットにしか機能しないため、うまくいきませんでした。
とりあえず、本題はメールいっぱい版で逃げましたが、ちょっとうるさいですよね。
というわけで、来週までになんとかがんばります。 あとがきわたしの場合、本業がプログラマーで、システム管理は3の次くらいなのですが、 それでも、イライラすることがあります。というか今もイライラしています。 イライライライラ…。
この間、通販の冊子に、イライラしたときの対処法が載っていました。
これでイライラ解消できれば苦労はしねーよと、 夫婦で突っ込みを入れてしまいましたが、少なくともすぐ試せるものは、 試してみてもいいんじゃないか、という気もしました。
というわけで、まずは深呼吸からはじめてみようと思います。
今週も、ここまで読んでいただき、ありがとうございました。
「いますぐ実践! Linux システム管理」の解除は、以下からできます。
バックナンバーは、こちらにほぼ全部そろっています。
「栗日記」−栗日記ぎゃらりー、近くをお越しの際は是非!! |
▼ トップ ▼ プロフィール ▼ リンク
▼ 作ってみました
▼ せんでん
▼ 最近読んだ本
▼ 気に入ってる本 |