Apache を daemontools で管理する

自作のサーバプログラムに、いちいち setuid とか setsid とかログローテート機能とか実装するのめんどくさいわけで。だから daemontools を使って管理してるわけですが、だったら、いっそ全部のデーモンを daemontools で一括管理したい。

ちょうど、reverse proxy をセットアップする機会があったので、apachedaemontools で管理する方法を備忘録をかねてメモ。

% cat /service/httpd/run
#!/bin/sh

APACHE_ROOT=/usr/local/apache-2.2.14
exec 2>&1
exec pgrphack $APACHE_ROOT/bin/httpd -DNO_DETACH -DFOREGROUND -c "ErrorLog /dev/fd/1" -c "Include /var/httpd/conf.d/*.conf"
% cat /service/httpd/log/run
# !/bin/sh

exec setuidgid nobody multilog t ./main

こんな感じ。-DNO_DETACH と -DFOREGROUND は(ほぼ)必須。

ErrorLog を /dev/fd/1 に回して、multilog によるローテートをやってるので、apache 内での logrotate によるバグに悩まされる心配もないかなーと (参考: ftp-adminの憂鬱: worker MPMの設定(前編))。

また、オリジナルの httpd.conf は一切いじらずに、サービス独自の設定ファイルは全部 /var/httpd/conf.d/*.conf に置く形にしました。これで、httpd をバージョンアップする際の作業 (と何かあった場合の切り戻し) が簡単になる、はず (違うディレクトリにインストールして、APACHE_ROOT を書き換えて svc -t するだけ)。

この方法だと複数 httpd を起動する場合も設定の管理が楽なんじゃないかな、とか思った。まあ -f my_conf_file して、その中で Include conf/httpd.conf する形でもいいんだけど。

12:55 追記: apachectl に対応する操作は以下のとおり。

apachectl daemontools
apachectl start svc -u /service/httpd
apachectl stop svc -d /service/httpd
apachectl restart svc -t /service/httpd
apachectl graceful svc -1 /service/httpd ((http://thedjbway.org/patches/daemontools-0.76.sigq12.patch の適用した場合。あるいは kill -USR1 `svstat /service/dmz_revproxy perl -pe 's/.*\(pid (\d+)\).*/$1/'`))

13:05 追記: httpdコマンドラインオプションについては httpd - Apache Hypertext Transfer Protocol Server - Apache HTTP Server Version 2.2 に記載があるのですが、なんか実際のものと違うっぽいので、httpd -h したほうがいいかもです。

12/16 追記: prefork mpm の場合は pgrphack しないとダメということで、例を修正しました。id:hirose31++