Apache VirtualHost Log-Script

Dynamische Vhost-Konfiguration unter Apache

Wer vie­le vir­tu­el­le Hosts unter Apa­che zu ver­wal­ten oder zu erstel­len hat, kennt das Pro­blem: Bei der Kon­fi­gu­ra­ti­on müs­sen immer die sel­ben Anga­ben ein­ge­tra­gen wer­den. Bei­spiels­wei­se das Docu­men­tRoot und der Name der Log­da­tei­en für die jewei­li­ge Domain. Natür­lich kann man  die Vhost-Kon­fi­gu­ra­ti­ons­da­tei­en mit einem Script erzeu­gen, es ist aber auch mög­lich Varia­blen zu ver­wen­den und sich damit die Tipp­ar­beit zu erleich­tern.


Mit der Ver­wen­dung von Vir­tu­al­Do­cu­men­tRoot und Vir­tu­al­Scrip­tA­li­as las­sen sich Tei­le des Domain-Namens in einer Apa­che-Kon­fi­gu­ra­ti­ons­da­tei ver­wen­den. Eine der­ar­ti­ge Datei könn­te bei­spiels­wei­se so aus­se­hen:

<VirtualHost *>
UseCanonicalName Off
ServerName meinedomain.de
ServerAlias *.meinedomain.de
VirtualDocumentRoot /var/www/%-2.0.%-1
VirtualScriptAlias /var/www/%-2.0.%-1/cgi-bin
DirectoryIndex index.htm index.html index.shtml start.htm start.html start.shtml index.php index.php3 index.php4
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost_common
CustomLog "|/usr/local/bin/apache_vhost_logger.pl" vhost_common
</VirtualHost>

Die­se Kon­fi­gu­ra­ti­on ist zustän­dig für meindomain.de und alle Sub­do­mains, wie www.meinedomain.de. Ser­ver­Na­me und Ser­ve­r­A­li­as sind wie gewohnt ein­zu­tra­gen.

Vir­tu­al­Do­cu­men­tRoot und Vir­tu­al­Scrip­tA­li­as ent­hal­ten Varia­blen, die einen Teil­string von meinedomain.de ent­hal­ten. „%-2.0.%-1“ ist in die­sem Bei­spiel der letz­te und vor­letz­te Teil des Domai­na­mens. Vir­tu­al­Do­cu­men­tRoot zeigt also auf das Ver­zeich­nis /var/www/meinedomain.de.

Etwas schwie­ri­ger ist es, eine eige­ne Log­da­tei für den vir­tu­el­len Host anzu­le­gen. Cus­tom­Log erlaubt kei­ne Varia­blen. Hier kann man aber ein Perl-Script (apche_vhost_logger.pl) ein­set­zen, das den Namen des vir­tu­el­len Host aus­liest und eine Log­da­tei dafür erstellt:

#!/usr/bin/perl
use IO::Handle;
$TARGET_DIR ="/var/log/apache2";
while ($log_line=<STDIN>) {
 ($vhost,$userhost,$remain) = split(/\s+/,$log_line,3);
 $vhost = "unknown" if (not $vhost);
 $target = $TARGET_DIR."/".$vhost.".log";
 open (my ($fh),">>$target");
 $fh->autoflush(1);
 print $fh "$userhost $remain\n";
}
exit 0;

Hin­ter Log­For­mat ist mit „%v“ der Beginn der Log­zei­le bestimmt. Die Varia­ble ent­hält den Namen des vir­tu­el­len Hosts. Das Script zer­legt die Log­zei­le in drei Tei­le $vhost, $user­host und $remain. Aus $vhost wird der Datei­na­me gebil­det, $user­host und $remain wer­den in das Log­file geschrie­ben. Wer will, kann $user­host (die IP-Num­mer des Web­sei­ten-Besu­chers) noch bear­bei­ten und bei­spiels­wei­se die IP-Adres­sen anony­mi­sie­ren.

Bit­te beach­ten Sie: Das Perl-Script wird von Apa­che für jeden Vhost gela­den und offen gehal­ten. Wenn Sie am Script etwas ändern, wird die Ände­rung erst nach „/etc/init.d/apache2 rel­oad“ wirk­sam.

Die hier vor­ge­stell­te Lösung hat eine klei­ne Schwä­che: Wenn Sie für einen Vhost eine spe­zi­el­le <Directory>-Direktive benö­ti­gen, müs­sen Sie hier wie­der den Namen des Ver­zeich­nis­ses (/var/www/meinedomain,.de) ein­tra­gen. Die Ver­wen­dung von Varia­blen ist hier nicht mög­lich.

Quellen

Apa­che Modu­le mod_vhost_alias


Schlagwörter:


Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Neueste Kommentare


Die Website durchsuchen