2003年8月7日 三木 邦弘
2003年8月19日改訂 SunOSについて記述を追加
2004年1月10日改訂 強制killの記述を追加
2004年8月3日改訂 apache(1.3.31)とmod_snmp(1.3.14.13)の記述を追加
2004年12月27日改訂 apache(1.3.33)とFreeBSD 5.3Rの記述を追加
はじめに 前提条件 MRTGの設定 FreeBSDへのインストール Solaris2へのインストール SunOS 4.1.4へのインストール 強制killについて apache(1.3.31)とmod_snmp(1.3.14.13)について apache(1.3.33)とFreeBSD 5.3Rについて
以前より学内ではsquidサーバーの稼動状況や回線の利用状況をSNMPを用いて調べて、MRTGでグラフ化するという事をしてきました。ふと、apacheでもできないのだろうか?と思いました。で、ちょっと調べてみるとすぐに、「An SNMP module for Apache」と言うページがみつかりました。ところがなかなか使えるところまで行かなかったので、メモでも作っておけば私よりあほな人(そんなにいないと思うが)や私より忙しい人(これはたくさん居ると思うが)の役に立つのではないかと思いました。
このSNMPモジュールは、Apacheの1.3.xに対応したものです。今回はApcheについてはapache_1.3.28.tar.gzを使用し、SNMPモジュールとしては、mod_snmp_1.3.14.12.tar.gzを利用しました。 もう少し新しい版に関しては後の方に説明があります。それぞれ製造元から取り寄せていただくとよいと思いますが、一応ファイル名をクリックすればダウンロードできると思います。以下に記述した苦労は恐らく今後新しいバージョンでは改善されると期待しています。
ちょっと順番が変ですが、共通する部分なので先に書いておきます。私はSNMP自体、特にMIB.txtについて全然詳しくないので大変苦労しました。SNMPモジュールにはapache-config-mib.txt、apache-scoreboard-mib.txt、www-mib.txtが付いてきます。(htdocs/manual/snmp_agtの下にあります)でも使えるのは一般的なSNMPv2のものとwww-mib.txtだけのようです。これはsnmpwalkで調べてみた結果です。もしかすると何かコンパイルのオプションなどがあるのかもしれません。さらにwww-mib.txtには重大な誤りがあってそのままMRTGには使えません。修正したwww-mib.txtはこれです。まぁ数字が一つ違うだけですが。
MRTGの設定ファイルも一つ例として提供します。あまり良い例だとは思えませんし、こんなのもろに見せて大丈夫?と言うのもありますが。漢字コードがEUCなのでメモ帳で見ると文字化けするかもしれません。グラフの方は、これだけと他のもをご覧ください。注意点は、
Target[accCount]: wwwSummaryOutResponses.1&wwwSummaryOutResponses.1:public@cc12:161
の.1の部分です。Apacheは仮想サーバーの機能を持っているので、一つのapacheでいくつものサーバーがあるように見せることができます。そのような場合は、それぞれについて集計されます。よってMRTGの方もそれぞれについてTargetの指定が必要になります。.1や.2がそれぞれどの仮想サーバーに対応しているかはsnmpwalkの出力の最初の方を見ればすぐわかります。
FreeBSD 4.8Rのシステムにインストールしました。以下の手順で問題無く終わったマシンと散々エラーが出まくったマシンがありました。多分後者は途中で色々間違えたりしてコンパイルが中途半端になったためと思われます。変にこじれたら全てのファイルを消して最初からやり直した方が良いようです。
apache_1.3.28.tar.gz
mod_snmp_1.3.14.12.tar.gz
を取ってくる。
tar xvfz apache_1.3.28.tgz
cd apache_1.3.28
tar xvfz ../mod_snmp_1.3.14.12.tar.gz
patch -p0 < src/modules/snmp_agt/mod_snmp.patch
./config.snmp
make
make install
このSNMPモジュールの作成者のマシンはFreeBSDのようなので、うまく行って当然なのかもしれません。httpd.confの最後に次のようなものを追加します。161はポートの番号です。既にucd_snmpなどが動いている場合は別の数字にします。このSNMP機能にはほとんど不正アクセスを防ぐ機能がありませんのでpublicの辺りは別のものにした方が良いでしょう。この設定では/var/runにbucketのファイルが置かれますが、いつ見ても空ですね。
# SNMP Configuration; only to be used if the SNMP agent is
included
# see src/modules/snmp for more information.
<SNMP 161>
SNMPcommunity public
SNMPbuckets /var/run
sysDescr Apache 1.3.28 HTTP/1.1 - SNMP module version 1.3.14.12
sysContact miki@ss.sugiyama-u.ac.jp
sysLocation cc05.center.sugiyama-u.ac.jp
</SNMP>
このSNMPモジュールは一応Solarisにも対応しているそうで、そのインストールのためのページも用意されていますが、左側のメニューのところにリンクが用意されていないので当初見落としていました。ただここにある通りではすんなり動いてくれませんでした。Solarisにインストールするためには、追加パッチ(mod_snmp_gdbm.patch)とGNU-DBM(gdbm-1.8.3.tar.gz)も必要となります。
apache_1.3.28.tar.gz
mod_snmp_1.3.14.12.tar.gz
gdbm-1.8.3.tar.gz
mod_snmp_gdbm.patch
を取ってくる。まずgdbmのインストールをする。
tar xvfz gdbm-1.8.3.tar.gz
cd gdbm-1.8.3
./configure
make
make install
cp /usr/local/lib/libgdbm.so.3 /usr/lib
cd ..
最後のコピーは汚い手ですがどうしてもapacheのconfigureの途中でこのライブラリが見つからないと言うエラーになってしまうので入れました。(でも次の日には、LD_LIBRARY_PATHを使えば良いことに気づきSunOSでのインストールに利用しました。)
tar xvfz apache_1.3.28.tgz
cd apache_1.3.28
tar xvfz ../mod_snmp_1.3.14.12.tar.gz
patch -p0 < src/modules/snmp_agt/mod_snmp.patch
patch -p0 < ../mod_snmp_gdbm.patch
setenv CFLAGS "-DSNMP -DUSE_GDBM"
setenv LDFLAGS "-L/usr/local/lib"
setenv LIBS "-lgdbm"
setenv INCLUDES "-I/usr/local/include"
./configure --activate-module=src/modules/snmp_agt/libsnmp_agt.a
本来ならばLDFLAGSの設定で/usr/local/libを探してくれるはずなのですが効きません。
make
すると途中でエラーになります。src/modules/snmp_agt/src_snmp/snmp_community.cの最初の方にある、
#ifdef SNMP_CONFIG_H
を
#ifndef _snmp_config_h_
に直して見てください。FreeBSDで引っかかったときもこれを直したら通りました。ところがこうしてできたhttpdは起動直後はSNMPに応答するのですが数分もすればだめになってしまいます。その他のWebサーバーとしての機能には問題はないようですが。こうならないようにするために、src/modules/snmp_agt/buckets.cに次のような変更を加えます。
*** buckets.c.org Wed Aug 6 20:25:18 2003
--- buckets.c Thu Aug 7 10:51:55 2003
***************
*** 92,97 ****
--- 92,98 ----
#elif USE_DBM
#elif USE_NDBM
#elif USE_GDBM
+ unlink(name);
bucket = gdbm_open(name, 0, (GDBM_NEWDB | GDBM_FAST), 0664,
NULL);
ap_bucket_errno = gdbm_errno;
#endif
データベースファイルを開く前に必ず消去すると言うのも変ですが、少し上の行を見ると本来のデータベース関数を利用した際も同じ事をしています。
make
make install
そして起動する前にhttpd.confの終わりに以下のものを追加します。Solaris2には/var/runがないので/var/logに入れるようにしてみました。FreeBSDの方と異なりこちらは24Kbyteほどのファイルができます。
# SNMP Configuration; only to be used if the SNMP agent is
included
# see src/modules/snmp for more information.
<SNMP 161>
SNMPcommunity public
SNMPbuckets /var/log
sysDescr Apache 1.3.28 HTTP/1.1 - SNMP module version 1.3.14.12
sysContact miki@ss.sugiyama-u.ac.jp
sysLocation cc05.center.sugiyama-u.ac.jp
</SNMP>
そんなマシンをまだ使っているのと言われそうですが、まぁそうなのだから仕方がない。Solaris2と同じようにまずgdbmをインストールしようとconfigureを実行してみると、なんとエラーが出て全然だめ。要するにSunOS附属のshがぼろすぎるらしい。そこでkshをインストールした。まず、
を取ってくる。これはAT&T Labs-Researchのダウンローどのページからもらってきた。すでにコンパイルが済んでいるので、これを/usr/local/binにおいて、
gunzip ksh.2003-07-24.sun4.gz
ln ksh.2003-07-24.sun4.gz ksh
rehash
とした。それから、
apache_1.3.28.tar.gz
mod_snmp_1.3.14.12.tar.gz
gdbm-1.8.3.tar.gz
mod_snmp_gdbm.patch
を取ってくる。まずgdbmのインストールをする。
tar xvfz gdbm-1.8.3.tar.gz
cd gdbm-1.8.3
ここでconfigureの先頭の行にある/bin/shを/usr/local/bin/kshに修正してから、
./configure
make
make install
make clean
cd ..
次にapacheのコンパイルです。
gunzip <apache_1.3.28.tgz | tar xvf -
cd apache_1.3.28
gunzip <../mod_snmp_1.3.14.12.tar.gz | tar xvf -
patch -p0 < src/modules/snmp_agt/mod_snmp.patch
patch -p0 < ../mod_snmp_gdbm.patch
setenv CFLAGS "-DSNMP -DUSE_GDBM"
setenv LD_LIBRARY_PATH "-L/usr/local/lib"
setenv LIBS "-lgdbm"
setenv INCLUDES "-I/usr/local/include"
./configure --activate-module=src/modules/snmp_agt/libsnmp_agt.a
apacheのconfigureは手を入れなくてもエラーになりませんでした。でもmakeをするとやっぱり途中でエラーになります。src/modules/snmp_agt/src_snmp/snmp_community.cの最初の方にある、
#ifdef SNMP_CONFIG_H
を
#ifndef _snmp_config_h_
に直します。そして、
make
make install
make clean
をして、httpd.confに、
# SNMP Configuration; only to be used if the SNMP agent is
included
# see src/modules/snmp for more information.
<SNMP 161>
SNMPcommunity public
SNMPbuckets /var/log
sysDescr Apache 1.3.28 HTTP/1.1 - SNMP module version 1.3.14.12
sysContact miki@ss.sugiyama-u.ac.jp
sysLocation cc05.center.sugiyama-u.ac.jp
</SNMP>
を追加してみると、Solaris2のときと違ってちゃんと動きます。よくわからん。。。ところが数日するとやはりSolaris2と同様にSNMP機能だけ応答がなくなることがわかった。そこで、src/modules/snmp_agt/buckets.cに次のような変更を加えてコンパイルをし直して現在様子を見ています。
*** buckets.c.org Wed Aug 6 20:25:18 2003
--- buckets.c Thu Aug 7 10:51:55 2003
***************
*** 92,97 ****
--- 92,98 ----
#elif USE_DBM
#elif USE_NDBM
#elif USE_GDBM
+ unlink(name);
bucket = gdbm_open(name, 0, (GDBM_NEWDB | GDBM_FAST), 0664,
NULL);
ap_bucket_errno = gdbm_errno;
#endif
このようにしてapacheにSNMPを組み込んで使用していたのですが、やっぱり時々SNMPの応答がなくなり、気が付くとMRTGからのエラーメールが何百も溜まっているということが続きました。ソースも少し眺めたのですがよくわかりません。そこで対症療法として、ucd-snmpに含まれているsnmpgetを利用してapacheの応答がなくなればkillすることにしました。スクリプトは次のような感じです。
#!/bin/sh
/usr/local/bin/snmpget localhost public system.sysDescr.0
>/dev/null || \
kill -1 `cat /usr/local/www/logs/httpd.pid`
これをcronで適当な間隔でrootの権限で起動します。とりあえず10分間隔にしてMRTGのエラーの一つぐらいは出てからkillがあたるようにしてみました。なおucd-snmpをわざわざ入れるのも面倒なので、SunOS4.1.4とSolaris2.5.1のsnmpgetと上記のスクリプトをtar+gzしたのものを以下のように作りました。/にて展開するとスクリプトは/usr/local/etcに、snmpgetは/usr/local/binに、MIBファイルが/usr/local/share/snmpに入ります。
夏休みになって少しソフトの更新をしようかと思って調べるとapacheだけでなく mod_snmpもバージョンが上がっていました。どちらも下の方が少しだけ変わっただけなので 普通は手順には違いが生じないのですが、そうでもありませんでした。またPHPも 動くようにと言うことで少しconfigureのパラメタも変更しました。以下の話はApcheについてはapache_1.3.31.tar.gzを使用し、SNMPモジュールとしては、mod_snmp_1.3.14.13.tar.gzを利用した場合です。
こちらは以前とほぼ同じですが、group_selectと言うスクリプトの実行権が 付いていなかったので付けました。PHPが使えるようにconfigureにパラメタを追加しています。
cd apache_1.3.31 tar xvfz mod_snmp_1.3.14.13.tar.gz patch -p0 < src/modules/snmp_agt/mod_snmp.patch chmod 755 src/modules/snmp_agt/group_select sh config.snmp --enable-module=so make make install
こちらは毎度苦労します。GDBMを使用するのでそのためのパッチも当てます。
cd apache_1.3.31 tar xvfz mod_snmp_1.3.14.13.tar.gz patch -p0 < src/modules/snmp_agt/mod_snmp.patch chmod 755 src/modules/snmp_agt/group_select patch -p0 < mod_snmp_gdbm.patch
さらにsrc/include/ap_config.hの138行目をコメントアウトします。
#undef NO_SETSID /* #define bzero(a,b) memset(a,0,b) */ #define HAVE_SYSVSEM_SERIALIZED_ACCEPT
そしてsrc/modules/snmp_agt/buckets.cの92行目にunlinkの行を追加しないと、 すぐSNMPの応答がなくなります。
#elif USE_GDBM unlink(name); bucket = gdbm_open(name, 0, (GDBM_NEWDB | GDBM_FAST), 0664,NULL);
このように直した上でconfigureとmakeをします。
sh config.snmp.php make make install
上記のconfig.snmp.phpファイルの中身は次のようなものです。
#!/bin/sh CFLAGS="-DSNMP -DUSE_GDBM" \ LDFLAGS="-L/usr/local/lib" \ LIBS="-lgdbm" \ INCLUDES="-I/usr/local/include" \ ./configure \ "--with-layout=Apache" \ "--activate-module=src/modules/snmp_agt/libsnmp_agt.a" \ "--enable-module=so" \ "$@"
冬休みになって少しソフトの更新をしようかと思って調べるとapacheのversionも 少し上がっていました。mod_snmpはお変わりなしでした。OSもそろそろ安定したかな、 とFreeBSD 4.10RからFreeBSD 5.3Rに上げてみました。とりあえずBinary UpgradeでOSだけ上げましたがapacheなどはそのまま動きました。ところがapacheの方も前回と同じ 手順で行けるかと思ったらそうでもありませんでした。makeの以前に、 src/modules/snmp_agt/src_snmp/agt_engine.cの165行目にある「default:」 の行を削除するか、コメントアウトしないとgccが文句を言ってきます。別に文法 エラーにするほどのものではないと思いますが。以下の話はApcheについては apache_1.3.33.tar.gzを使用し、SNMP モジュールとしては、mod_snmp_1.3.14.13.tar.gzを利用し た場合です。
cd apache_1.3.33 tar xvfz mod_snmp_1.3.14.13.tar.gz patch -p0 < src/modules/snmp_agt/mod_snmp.patch chmod 755 src/modules/snmp_agt/group_select sh config.snmp --enable-module=so src/modules/snmp_agt/src_snmp/agt_engine.cの修正 make make install