
Die Frage betrifft die Zugriffs- und Fehlerprotokolle, insbesondere bei mehreren Hosts (auf mehr als einem Server installierte Apache-Instanzen) und der zentralen Speicherung der Protokolle auf einem Netzwerkdateisystem.
Schließt Apache jede Protokolldatei nach jedem Schreibvorgang?
Wenn ja, scheint dies auf einem stark ausgelasteten Server, auf dem viele Sites gehostet werden und auf dem jede Site über ein eigenes Protokoll verfügt, ein potenzieller Leistungsengpass zu sein?
Falls nein, was ist die Lösung, wenn mehrere Server an einen einzigen Protokollierungsort in einem Netzwerkdateisystem schreiben?
Antwort1
Schließt Apache jede Protokolldatei nach jedem Schreibvorgang?
Benutzen Sie die Quelle, sie befindet sich unter: https://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/modules/loggers/mod_log_config.c?view=markup
Darin können Sie lesen:
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.
Das deutet darauf hin, dass es nur einmal geöffnet wird. Tatsächlich wird es aus offensichtlichen Leistungsgründen aus dem Code heraus schon früh, bei der Initialisierung, geöffnet und dann nie wieder geschlossen.
Falls nein, was ist die Lösung, wenn mehrere Server an einen einzigen Protokollierungsort in einem Netzwerkdateisystem schreiben?
Tun Sie das auf keinen Fall, und zwar aus zwei Gründen. Erstens: Loggen Sie sich nicht auf diese Weise remote ein. Loggen Sie lokal ein (und versenden Sie die Logdateien separat, Sie können sie beispielsweise stündlich wechseln) oder verwenden Sie die entsprechenden Daemons, syslog
die standardmäßig wissen, wie man Loginhalte per UDP (oder TCP) versendet, ebenso wie neuere Lösungen. Mounten Sie keine Remote-Festplatte und schreiben Sie keine Logdateien darauf, das beeinträchtigt die Leistung und verursacht eine ganze Reihe von Problemen (insbesondere, wenn Sie mit „remote“ „NFS“ meinen).
Und auch wenn es lokal ist, sollte jede Anwendung ihre eigenen Protokolldateien verwenden. Verwenden Sie nicht mehrere Anwendungen, die in dieselbe Datei protokollieren. Dies führt zwangsläufig zu allen möglichen Race Conditions, Überschreibungen usw. Apache selbst ist eine Anwendung, auch wenn es sich aufspaltet. Wenn Sie jedoch zwei Apache-Anwendungen separat auf demselben Host mit unterschiedlichen Konfigurationen laufen lassen, sollten sie jeweils ihre eigenen Protokolldateien verwenden.
Oder sehen Sie sich die Apache-Funktion zum Protokollieren in Pipes an, aber auch diese hat Nachteile.
Antwort2
Soweit ich weiß, können nicht mehrere Apache-Webserver gleichzeitig in dieselbe Protokolldatei schreiben.
Bei Clustern lassen Sie entweder jeden Knoten in seine eigene Protokolldatei schreiben und führen dann eine Nachbearbeitung durch, um sie zusammenzuführen, oder Sie lassen Apache Syslog-Ereignisse generieren und senden diese an einen zentralen Syslog-Server, wo Sie sie in einer einzigen Datei zusammenführen können, oder Sie verwenden eine Protokollaggregationslösung wie ELK Stack, Graylog, Splunk und/oder andere, um Protokollereignisse von allen Clusterknoten an eine einzige Big-Data-Datenbank zu senden.