Apache Log File Tuning

Aus netcup Wiki
Zur Navigation springen Zur Suche springen

Dieser Tipp hier bezieht sich auf netcup vServer mit Apache und SysCP!


Um was geht's?

Wenn man unter SysCP mehrere Domains hat, diese stark besucht sind und man auch noch für jede Domain eine Speciallogfile angelegt hat, kann man schneller Festplattenplatz verlieren als einem lieb ist. Diese Speciallogfiles sind eine separate Apache accesslog und errorlog Datei, die für Webalizer benutzt wird (die Dateien liegen in /var/kunden/logs). Man erhält also nach Domains getrennt Statistiken. Eigentlich eine gute Sache, aber leider geht SysCP hier, wie so oft, wieder eigene Wege.

Durch diese "Auskopplung", wird die normale Config Datei von Webalizer nicht beachtet und somit kann man auch nicht für jede Domain einzeln bestimmen, dass die Statistiken inkrementell geführt werden. Das wäre aber nötig, um die Log Files in das Log Rotate aufzunehmen, damit diese Log Files hin und wieder geleert werden, ohne die Statistik zu verlieren.

Man denkt sich vielleicht "Na und? ist doch egal ob man die Log Files löschen kann", aber so einfach ist das nicht. Die Log Files werden nämlich kontinuierlich erweitert, wodurch sie wachsen und wachsen. Auf einer meiner Domains habe ich im Schnitt am Tag ca. 500 Besucher, diese durchstöbern natürlich die Webseite und fordern somit eine Menge Dateien vom Server an, was alles fein säuberlich in der accesslog festgehalten wird. Jedes Bildchen, Grafik, CSS, usw. wird protokolliert. Dadurch ist die accesslog allein in den letzten 6 Wochen um fast 200 MB gewachsen! Man kann sich leicht ausrechnen was da in einem Jahr zusammenkommt , wenn man 2000+ Besucher am Tag hat.

Wie erwähnt, Webalizer selbst würde ja eine Lösung anbieten, aber das wird leider von SysCP zunichte gemacht. Man müsste die Cron Dateien von SysCP schon um einiges erweitern, damit man für jede zu loggende Domain eine eigene Config Datei generieren lässt, damit man Log Rotate benutzen kann.

Es gibt aber einen Workaround, der zwar auch nicht die ultimative Lösung ist, aber das Problem deutlich reduziert!


Der Workaround

Wir bringen einfach dem Apache bei, dass er nicht jeden Sch... loggen soll, sondern nur Zugriffe auf Informationsdateien (HTML, PHP Seiten) und nicht auf Bilder, CSS, JS, usw.

Wir können auch wieder nicht einfach in der Apache Config einstellen was wir möchten, sondern müssen (müssen nicht, aber ist das sauberste und flexibelste) der vHost Datei, die von SysCP alle 5 Minuten neu erstellt wird, einen Zusatz hinzufügen, damit wir im SysCP Control Panel die Konfiguration vornehmen können.

Schritt 1

Die Cron Datei im Editor öffnen:

/var/www/syscp/scripts/cron_tasks.inc.http.10.apache.php

Vorher ein Backup der Datei machen!!

Schritt 2

Hier diese Zeile suchen:

$logfiles_text.= '  CustomLog "' . $this->settings['system']['logfiles_directory'] . $domain['loginname'] . $speciallogfile . '-access.log" combined' . "\n";

und hinter das "combined" ein "env=!dontlog" setzen. Damit sollte die Zeile so aussehen:

$logfiles_text.= '  CustomLog "' . $this->settings['system']['logfiles_directory'] . $domain['loginname'] . $speciallogfile . '-access.log" combined env=!dontlog' . "\n";

Speichern und Editor verlassen.

Schritt 3

Apache neu starten

Jetzt warten wir ca. 5 Minuten, bis der Cron das nächste Mal ausgeführt wurde und schauen dann kurz in die Datei /etc/apache2/sites-available/99_syscp_vhosts.conf Dort sollte jetzt eigentlich für jede Domain eine Zeile stehen die ähnlich dieser ist:

CustomLog "/var/customers/logs/<domain name>-access.log" combined env=!dontlog

Wichtig ist der Zusatz "env=!dontlog". Fehlt der, habt Ihr an der falschen Stelle in der Cron Datei gewerkelt!

Schritt 4

Die Konfiguration findet im Admin Panel statt, unter Domains->Eigene vHost-Einstellungen.

Dort können wir jetzt dem Apache mitteilen, welche Zugriffe auf Dateien er jetzt loggen soll und welche nicht. Um z.B. keine Logeinträge mehr von Grafikdateien (darunter fallen Hintergründe einer Seite, Spacer, Banner, einfach alles was grafisch ist) zu erstellen, geben wir in das vHost Feld ein:

SetEnvIfNoCase Request_URI ".(gif)|(jpg)|(png)|(css)|(js)|(ico)$" dontlog

Wichtig ist hier wieder das korrespondierende "dontlog". Hier werden also Zugriffe auf Dateien, die auf .gif, .jpg, .png, .ico, .css, .js enden nicht mehr in die accesslog geschrieben.

Möchte man keine Logeinträge von Dateien in einem bestimmten Unterverzeichnis, benutzt man z.B:

SetEnvIf Request_URI "^/unterordner" dontlog

Logeinträge von Spider, z.B. Google Bot kann man unterbinden mit

SetEnvIFNoCase User-Agent "Googlebot" dontlog

Ebenso kann man Zugriffe von bestimmten Seiten ausschließen

SetEnvIfNoCase Referer "domain.tld" dontlog

Fazit

Der bessere Weg wäre natürlich immer noch die Log Files in das Log Rotate aufzunehmen und alte Log Files zu löschen, aber das erweist sich als erheblich komplexer, als es auf den ersten Blick aussieht. Mit dieser Ausdünnung der Log File kann man aber das Volumen enorm reduzieren. Ich habe Log-Einträge bei Zugriffe auf Grafiken, CSS, JS und einige Unterverzeichnisse, in denen interner Kram liegt, ausgeschlossen und das täglich dazu kommende Volumen beträgt nur noch 1/10 von dem Ursprünglichen.

Eingesendet von Andreas Skodzek - http://www.phpbuddy.eu/