いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! 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 システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」−盆も正月も関係なく、毎日描きます。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://www.fumido.co.jp/kuriniki/ (栗日記ぎゃらりー)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本