
質問は、アクセス ログとエラー ログに関するもので、特に複数のホスト (複数のサーバーにインストールされている Apache インスタンス) があり、ログがネットワーク ファイル システムに集中して保存されている場合に当てはまります。
Apache は書き込みのたびに各ログ ファイルを閉じますか?
もしそうなら、それぞれ独自のログを持つ多くのサイトをホストしている忙しいサーバーでは、それが潜在的なパフォーマンスのボトルネックになると思われますか?
いいえの場合、複数のサーバーがネットワーク ファイル システム上の単一のログ記録場所に書き込む場合の解決策は何ですか?
答え1
Apache は書き込みのたびに各ログ ファイルを閉じますか?
ソースを使用してください。ソースは次の場所にあります: https://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/modules/loggers/mod_log_config.c?view=markup
そこから読み取ることができます:
251 * log_writer is NULL before the log file is opened and is
252 * set to a opaque structure (usually a fd) after it is opened.
これは、一度だけ開かれるというヒントになります。実際、コードを見ると、パフォーマンス上の理由から、初期化時に早く開かれ、その後は決して閉じられません。
いいえの場合、複数のサーバーがネットワーク ファイル システム上の単一のログ記録場所に書き込む場合の解決策は何ですか?
絶対にそうしないでください。理由は 2 つあります。まず、そのようにリモートでログを記録しないでください。ローカルでログを記録し (ログ ファイルを個別に送信し、たとえば 1 時間ごとにローテーションできます)、適切なデーモンを使用しますsyslog
。新しいソリューションと同様に、これらのデーモンはログ コンテンツを UDP (または TCP) で送信する方法を既定で認識しています。リモート ディスクをマウントしてログ ファイルを書き込まないでください。パフォーマンスが低下し、さまざまな問題が発生します (特に「NFS」のようなリモートを意味する場合)。
また、たとえローカルであっても、各アプリケーションは独自のログファイルにログを記録する必要があり、複数のアプリケーションが同じファイルにログを記録しないようにしてください。これにより、あらゆる種類の競合状態や上書きなどが生じます。Apache 自体は、フォークした場合でも 1 つのアプリケーションですが、同じホスト上で異なる構成で 2 つの Apache を別々に実行している場合は、それぞれ独自のログファイルにログを記録する必要があります。
または、パイプにログを記録する Apache 機能を検討してください。ただし、これにも欠点があります。
答え2
私の知る限り、複数の Apache Web サーバーが同時に同じログ ファイルに書き込むことはできません。
クラスターの場合、各ノードが独自のログ ファイルに書き込むようにして、後処理を行ってそれらをマージするか、Apache で syslog イベントを生成し、それを中央の syslog サーバーに送信して 1 つのファイルにマージするか、ELK Stack、Graylog、Splunk などのログ集約ソリューションを使用して、すべてのクラスター ノードからのログ イベントを 1 つのビッグ データ データベースに送ります。