Apache HTTP サーバ バージョン 2.3
たくさんのバーチャルホストを運用する場合、もし、 各バーチャルホストごとに異なるログファイルが指定してあると、 Apache がファイル記述子 (ファイルハンドルとも呼ばれます) を使い切ってしまうことがあります。Apache が使用するファイル 記述子の数は、各エラーログファイルにつき 1 つ、他のログファイルの ディレクティブにつき 1 つ、さらに内部で使用する 10 から 20、 の合計になります。Unix オペレーティングシステムではプロセスごとに 使用可能なファイル記述子の数を制限しています。たいていの場合は 64 で、 普通は大きな値のハードリミットまで増やすことができます。
Apache は必要に応じて上限を拡大しようと試みますが、 以下のような場合にはうまくいかないかもしれません。
setrlimit()
システムコールが提供されていない。setrlimit
(RLIMIT_NOFILE) が動作しない
(たとえば Solaris 2.3 のように)。問題が発生した時に取り得る対処方法は次のとおり:
<VirtualHost>
セクションでログファイルを指定せず、メインのログファイルにのみ記録する。
(これに関する詳しい情報は以下のログファイルの分割を読んでください。)
#!/bin/sh
ulimit -S -n 100
exec httpd
複数のバーチャルホストのログを同じログファイルに収集しようとしているときには、 各バーチャルホストについて統計的な解析を実行するために後でログファイルを 分割したくなるかもしれません。これは以下のようにして実現できます。
まず、バーチャルホストの情報をログのエントリに追加する必要があります。
これは LogFormat
ディレクティブの %v
変数を使うことでできます。
これをログのフォーマット文字列の先頭に追加します:
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost
CustomLog logs/multiple_vhost_log vhost
これは common log format のログを作成しますが、それぞれの行の先頭に
正規化されたバーチャルホストの名前
(ServerName
ディレクティブに書かれているもの) が付加されます。
(ログファイルのカスタマイズの詳細については Custom Log Formats を
読んでください。)
ログファイルを各部分 (バーチャルホスト毎に 1 ファイル) に分けたいときは、
split-logfile
を使って行なうことができます。プログラムは Apache 配布の
support
ディレクトリにあります。
以下のようなコマンドでこのプログラムを実行します:
split-logfile < /logs/multiple_vhost_log
このプログラムはバーチャルホストのログファイルの名前とともに実行され、
ログファイルに現れるそれぞれのバーチャルホスト毎に一つのファイルを作成します。
それぞれのファイルは ホスト名.log
という名前になります。