Home

技術系のメモと日々の雑感

mod_status で Apache の動きを見る

2ヶ月ほど前に立てた Web サーバがずっと放置状態だった。
負荷が上がるほどアクセスがあったら嬉しいけど、そっちの心配はぜんぜんないんでね。
とはいえ、アクセス状況をまったく把握してないのはさすがにマズいということで、mod_status を有効にしておくことにした。
Apache はソースから入れたので、デフォルトで組み込まれているはず。
設定のひな型は extra/httpd-info.conf の中にあった。

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 10.0.0
</Location>

ExtendedStatus On

アクセスできるように Allow from を修正。
合わせて、ExtendedStatus の行がコメントになっているので有効にする。
これが無効のままだとちょっと寂しいページになるね。
あとは、httpd.conf の中で httpd-info.conf を Include している行を有効にしたら設定完了。
Apache をリスタートして、http://XXX.XXX.XXX.XXX/server-status/ にアクセスすると表示される。
・・・と言いたいところだけど、今回設定したサーバでは mod_rewrite で URL を書き換えていたので、これだけではうまくいかなかった。
この場合、VirtualHost を追加して、そっちを見に行くのがいちばん簡単かな。
それにしても、mod_status は利用してる人が少ないのか、サンプルを載せてるところってあまり見当たらないね。
なので、バージョン 2.2.4 のサンプルを置いておこう。
このサーバはアクセスが少ないけど、忙しいサーバだと見てて楽しいだろうなぁ。

load average 急上昇の原因は?

とあるサーバで load average が急激に上がった。

top - 10:37:55 up 504 days, 13:15,  1 user,  load average: 12.06, 12.03, 12.20
Tasks: 130 total,  13 running, 117 sleeping,   0 stopped,   0 zombie
Cpu(s): 10.7%us,  0.0%sy,  0.0%ni, 89.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2066496k total,  1851856k used,   214640k free,   142048k buffers
Swap:  1015800k total,        0k used,  1015800k free,   251724k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  537 root      25   0 54584  51m  716 R   20  2.6  55:30.78 logrotate
 1420 root      25   0 56760  54m  692 R   20  2.7  47:13.77 logrotate
 3225 root      25   0 50036  47m  692 R   20  2.4  26:20.68 logrotate
 4296 root      25   0 71636  67m  716 R   20  3.4 247:37.94 logrotate
 4976 root      25   0 34136  32m  692 R   20  1.6   5:54.74 logrotate
22993 root      25   0 68412  65m  716 R   20  3.3 217:02.44 logrotate
28603 root      25   0 67084  63m  716 R   20  3.2 104:13.14 logrotate
29479 root      25   0 66340  62m  716 R   20  3.1  93:25.04 logrotate
31231 root      25   0 63372  60m  692 R   20  3.0  73:54.32 logrotate
 4103 root      25   0 45056  42m  692 R   12  2.1  15:46.17 logrotate
22101 root      25   0 68856  66m  716 R    8  3.3 231:05.95 logrotate

見ての通り、logrotate が大量に起動している。
一旦すべて kill したら、load average はすぐに下がってくれた。
それにしても、%CPU を足したら軽く 100 を越えているのに idle が 89% って・・・。
まぁ、気にしても仕方ないか。
で、/var/log を見て唖然。
ls が返ってこないな〜と思ったら、ファイルが数十万個も溜まっていた。
ほとんどが messages と maillog で、ファイル名が明らかにおかしい。

messages.1.gz.2.gz.2.gz.2.gz.3.gz.2.gz.1.gz
maillog.1.gz.1.gz.2.gz.2.gz.2.gz.1.gz

なるほど。
複数の logrotate の処理がぶつかるとこんな動きになるんだね。
って、のんびり観察してる場合じゃなかった。
古いログファイルを削除して、logrotate の設定も見直し。
messages も maillog も多めに残すようにしていたので、値を減らしておいた。
でも結局、根本的な原因は不明。
ハード障害の疑いも捨てきれないので、環境を別のマシンに移動してしまおう。

特定のバージョンの yum のリポジトリをローカルに作る

以前書いた手順で yum のリポジトリをローカルに作ろうとして、ふと CentOS の本家のサイトを見たら 5.4 がリリースされていることに気付いた。
ということは、普通にリポジトリを作ったら 5.4 用になるのか。
でも、仕事で使っているサーバはまだ 5.3 なので、いきなりバージョンアップするわけにもいかないんだよね。
そこで、最新ではなく、特定のバージョン(今回は 5.3)でリポジトリを作る方法を調べてみた。
以前書いた手順でいうと、updates リポジトリに comps.xml をコピーするところまでは同じだ。
あとは updates リポジトリも 5.3 で作ったらいけるはず。
reposync でバージョンを指定してダウンロードする方法がないかと、CentOS-Base.repo の設定を色々と変えてみたけど、これはうまくいかなかった。
方針変更。
正常に動いている環境の updates リポジトリを見ると、updates/RPMS と repodata というディレクトリが存在していた。
どうやら reposync が作っているのはこの2つみたいだね。
それなら普通にダウンロードしてみよう。

cd /usr/local/apache/htdocs/repos/centos/5/i386
rsync -av rsync://ftp.riken.jp/centos/os/5.3/updates/i386/ .

同一パッケージで複数のバージョンがあってもお構いなしに全パッケージ取ってくるので、恐ろしく効率が悪いけど・・・。
まぁ、それは気にしないことにして、これで

createrepo .

がうまく通ったので、別のマシンから yum update してみると、見事成功!
めでたしめでたし。
結局、この方法だとミラーサイトとは同期しないので、サーバ側の CentOS-Base.repo の調整は不要だった。
ちなみに、CentOS のミラーサイトには最新とひとつ前のバージョンしかないけど、削除されたバージョンは次のサイトに置いてある。
http://vault.centos.org/
利用しているバージョンがミラーサイトから消えてしまっても、とりあえず安心だね。

error reconnecting to master

MySQL のスレーブで、stop slave してから読み取りロックをかけてダンプを取ったときのこと。
ロックを解除して、start slave でレプリケーションを再開してから show slave status の出力を見たら、Last_IO_Error にメッセージが出ていた。

Last_IO_Error: error reconnecting to master 'hoge@XXX.XXX.XXX.XXX:3306' - retry-time: 60 retries: 86400

Slave_IO_Running も Slave_SQL_Running も Yes になってるし、Last_Errno は 0 なので、一時的なエラーだろうね。
でも、何となく気持ち悪いので mysqld をリスタートしてみたら、無事にメッセージは消えてくれた。
これって放っておいたら勝手に消えるのかな。

Apache の configure オプションを理解する

先日、mod_proxy を使うために Apache をコンパイルしなおそうとしたときのこと。
configure のオプションはずっと前に誰かが考えたのを使い回していた。
いわゆる秘伝のタレみたいなものだ。
そんないいものじゃないか。
まぁ、深く考えずに、--enable-proxy を足すだけでいいだろうと思っていた。

./configure --prefix=/usr/local/apache --enable-module=so --enable-so ¥
--enable-rule=SHARED_CORE --enable-ssl --enable-rewrite --enable-proxy

でも、よく見るといくつかの疑問が。
--enable-rule=SHARED_CORE って?
--enable-module=so と --enable-so は何が違うの?
う〜ん・・・。
やっぱり理解しないまま使うのはよろしくないね。
いい機会なので、リファレンスを眺めてみた。
分かった範囲で configure のオプション指定の基本ルールをまとめると

■ オプションなしでもデフォルトのモジュール(Baseセット)が有効になっている
■ --enable-[module名] と指定するとモジュールが静的に組み込まれる
■ Shared Object(DSO)にする場合、--enable-[module名]=shared で個別に指定するか
    --enable-mods-shared=all ですべてを指定する

といったところ。
ちなみに、Base セットに含まれるモジュールの説明は、リファレンスにも書かれてないようだ。
何だかスッキリしないなぁ。
確認する方法を考えているうちに、--enable-mods-shared=all だけ指定してコンパイルする方法を思いついた。
これなら、modules ディレクトリの下にデフォルトで有効なモジュールだけが作られるはず。
早速、2.2.13 のソースでやってみたら次のファイルが作られた。

mod_actions.so          mod_cern_meta.so   mod_log_config.so
mod_alias.so            mod_cgi.so         mod_log_forensic.so
mod_asis.so             mod_dav.so         mod_logio.so
mod_auth_basic.so       mod_dav_fs.so      mod_mime.so
mod_auth_digest.so      mod_dbd.so         mod_mime_magic.so
mod_authn_anon.so       mod_deflate.so     mod_negotiation.so
mod_authn_dbd.so        mod_dir.so         mod_rewrite.so
mod_authn_dbm.so        mod_dumpio.so      mod_setenvif.so
mod_authn_default.so    mod_env.so         mod_speling.so
mod_authn_file.so       mod_expires.so     mod_status.so
mod_authz_dbm.so        mod_ext_filter.so  mod_substitute.so
mod_authz_default.so    mod_filter.so      mod_unique_id.so
mod_authz_groupfile.so  mod_headers.so     mod_userdir.so
mod_authz_host.so       mod_ident.so       mod_usertrack.so
mod_authz_owner.so      mod_imagemap.so    mod_version.so
mod_authz_user.so       mod_include.so     mod_vhost_alias.so
mod_autoindex.so        mod_info.so

core モジュールとかも含まれてるかもしれないけど、参考にはなるだろう。
mod_rewrite はデフォルトで有効なんだね。
あと、--enable-rule=SHARED_CORE はすでに使われてないオプションで、--enable-module=so も古い指定方法らしい。
ということで、上で書いたオプション指定を 2.2 用に修正すると

./configure --prefix=/usr/local/apache --enable-so --enable-ssl=shared --enable-proxy=shared

こんなところか。
秘伝のタレもたまには作り直さないと腐るよね・・・。