もはやApache httpdのディレクトリ構成やファイル配置はディストリビューションによって全く異なってきているのが現状です。
そういう状況で、システムにインストールされているApacheの設定に対して、なにかアクションを起こしたい場合は、システム依存のパスをスクリプトに直接かいている人もいるかもしれません。
そこで今回は、apxsコマンドさえ特定できれば、Apacheのディレクトリ構成やファイルの配置を動的に取得できるので、それを試してみましょう。
apxsのクエリオプションを使う
動的に構成情報を取得するためには、apxsのクエリーオプションを使えば良いです。クエリオプションは-qで与えられており、例えば以下のコマンドを実行すると、
[program lang=’bash’ escaped=’true’]
apxs -q
[/program]
ずらーっとApacheに関するインストールやビルドの情報一覧が得られます。(バージョンによっては一覧はでない場合もあります)
また、特定のクエリのみを実行するには、
[program lang=’bash’ escaped=’true’]
apxs -q exp_sysconfdir
[/program]
とすると、
[program lang=’bash’ escaped=’true’]
/usr/local/apache246/conf
[/program]
という結果が得られれます。
これらのクエリを使えば、システムにインストールされているApacheの各種ディレクトリやファイルを動的に取得することができるでしょう。
Apacheの設定ファイルのパスを取得する
Apacheモジュールをかいた事がある人はよくご存知だと思いますが、apxsを使って開発したApacheモジュールを自動でインストールすることができます。つまり、apxsはシステムにインストールされているApacheの構成を理解していることになりますよね。
ということは、apxsのソースを読めば、いかにしてそれらを検出しているのかが理解できると思います。
例えばApacheの設定ファイルは、Fedoraだとhttpd.confだったり、Ubuntuだとapache2.confだったりします。これはどのように決められていて、apxsはその設定ファイルを適切に導き出しているのでしょうか。
apxsのソースをみると、上記で投げていたクエリの答えは、以下のファイルを参照している事がわかります。
[program lang=’perl’ escaped=’true’]
my $installbuilddir = “/usr/local/apache246/build”;
get_config_vars(“$installbuilddir/config_vars.mk”,\%config_vars);
[/program]
つまり、config_vars.mkがシステムにインストールされたApacheに関する情報になりますね。ここを見れば大抵のインストール情報がのっています。クエリオプションはそのラッパーコマンドといった感じでしょうか。
続いて、設定ファイルをどのように導き出しているのかを見ると、
[program lang=’perl’ escaped=’true’]
my $CFG_TARGET = get_vars(“progname”);
my $CFG_SYSCONFDIR = get_vars(“sysconfdir”);
(snip)
open(FP, “<$CFG_SYSCONFDIR/$CFG_TARGET.conf“) || die;
[/program]
このように、confのディレクトリとプロセスのprognameから導き出している事がわかります。つまり、apxsコマンドのクエリを使ってApacheの設定ファイルのパスを検出するためには以下のようにすれば良い事がわかります。
[program lang=’bash’ escaped=’true’]
echo $(apxs -q sysconfdir)/$(apxs -q progname).conf
[/program]
これによって、Fedoraで自前ビルドしたApacheだと、
[program lang=’bash’ escaped=’true’]
/usr/local/apache246/conf/httpd.conf
[/program]
Ubuntuだと
[program lang=’bash’ escaped=’true’]
/etc/apache2/apache2.conf
[/program]
と適切な設定ファイルのパスが得られます。
まとめ
以上のようにapxsがわかっていれば、それに関連したApacheのディレクトリ構造が大抵の場合動的に検出することができます。
クエリの一覧を見ると様々な情報が得られますので、apxsを利用して静的に書いていたパス等をうまく動的に検出して、複数の環境でも動くようなコードをかいみてはいかがでしょうか。