Apache を daemontools で管理する
自作のサーバプログラムに、いちいち setuid とか setsid とかログローテート機能とか実装するのめんどくさいわけで。だから daemontools を使って管理してるわけですが、だったら、いっそ全部のデーモンを daemontools で一括管理したい。
ちょうど、reverse proxy をセットアップする機会があったので、apache を daemontools で管理する方法を備忘録をかねてメモ。
% 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++