ファイル記述子の限界 - Apache HTTP サーバ バージョン 2.2

Apache Server 2.2

<-

ファイル記述子の限界

この日本語訳はすでに古くなっている 可能性があります。 最近更新された内容を見るには英語版をご覧下さい。

たくさんのバーチャルホストを運用する場合、もし、 各バーチャルホストごとに異なるログファイルが指定してあると、 Apache がファイル記述子 (ファイルハンドルとも呼ばれます) を使い切ってしまうことがあります。Apache が使用するファイル 記述子の数は、各エラーログファイルにつき 1 つ、他のログファイルの ディレクティブにつき 1 つ、さらに内部で使用する 10 から 20、 の合計になります。Unix オペレーティングシステムではプロセスごとに 使用可能なファイル記述子の数を制限しています。たいていの場合は 64 で、 普通は大きな値のハードリミットまで増やすことができます。

Apache は必要に応じて上限を拡大しようと試みますが、 以下のような場合にはうまくいかないかもしれません。

  1. 利用しているシステムで setrlimit() システムコールが提供されていない。
  2. システム上で setrlimit(RLIMIT_NOFILE) が動作しない (たとえば Solaris 2.3 のように)。
  3. 要求されるファイル記述子の数が ハードリミットを超えてしまう。
  4. システムにファイル記述子に関して別の制限が存在してしまっている。 たとえば、stdio ストリームではファイル記述子を 256 以上使えない (Solaris 2)、など。

問題が発生した時に取り得る対処方法は次のとおり:

  • ログファイルの数を減らす。<VirtualHost> セクションでログファイルを指定せず、メインのログファイルにのみ記録する。 (これに関する詳しい情報は以下のログファイルの分割を読んでください。)
  • もし、前述の 1 または 2 の場合であれば、 Apache を起動する前にファイル記述子を増やします。 たとえば次のようなスクリプトを使います。

    #!/bin/sh
    ulimit -S -n 100
    exec httpd

top

ログファイルの分割

複数のバーチャルホストのログを同じログファイルに収集しようとしているときには、 各バーチャルホストについて統計的な解析を実行するために後でログファイルを 分割したくなるかもしれません。これは以下のようにして実現できます。

まず、バーチャルホストの情報をログのエントリに追加する必要があります。 これは 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 という名前になります。