Dynamische Vhost-Konfiguration unter Apache

Apache VirtualHost Log-Script

Wer viele virtuelle Hosts unter Apache zu verwalten oder zu erstellen hat, kennt das Problem: Bei der Konfiguration müssen immer die selben Angaben eingetragen werden. Beispielsweise das DocumentRoot und der Name der Logdateien für die jeweilige Domain. Natürlich kann man  die Vhost-Konfigurationsdateien mit einem Script erzeugen, es ist aber auch möglich Variablen zu verwenden und sich damit die Tipparbeit zu erleichtern.


Mit der Verwendung von VirtualDocumentRoot und VirtualScriptAlias lassen sich Teile des Domain-Namens in einer Apache-Konfigurationsdatei verwenden. Eine derartige Datei könnte beispielsweise so aussehen:

1
2
3
4
5
6
7
8
9
10
<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>

Diese Konfiguration ist zuständig für meindomain.de und alle Subdomains, wie www.meinedomain.de. ServerName und ServerAlias sind wie gewohnt einzutragen.

VirtualDocumentRoot und VirtualScriptAlias enthalten Variablen, die einen Teilstring von meinedomain.de enthalten. „%-2.0.%-1“ ist in diesem Beispiel der letzte und vorletzte Teil des Domainamens. VirtualDocumentRoot zeigt also auf das Verzeichnis /var/www/meinedomain.de.

Etwas schwieriger ist es, eine eigene Logdatei für den virtuellen Host anzulegen. CustomLog erlaubt keine Variablen. Hier kann man aber ein Perl-Script (apche_vhost_logger.pl) einsetzen, das den Namen des virtuellen Host ausliest und eine Logdatei dafür erstellt:

1
2
3
4
5
6
7
8
9
10
11
12
#!/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;

Hinter LogFormat ist mit „%v“ der Beginn der Logzeile bestimmt. Die Variable enthält den Namen des virtuellen Hosts. Das Script zerlegt die Logzeile in drei Teile $vhost, $userhost und $remain. Aus $vhost wird der Dateiname gebildet, $userhost und $remain werden in das Logfile geschrieben. Wer will, kann $userhost (die IP-Nummer des Webseiten-Besuchers) noch bearbeiten und beispielsweise die IP-Adressen anonymisieren.

Bitte beachten Sie: Das Perl-Script wird von Apache für jeden Vhost geladen und offen gehalten. Wenn Sie am Script etwas ändern, wird die Änderung erst nach „/etc/init.d/apache2 reload“ wirksam.

Die hier vorgestellte Lösung hat eine kleine Schwäche: Wenn Sie für einen Vhost eine spezielle <Directory>-Direktive benötigen, müssen Sie hier wieder den Namen des Verzeichnisses (/var/www/meinedomain,.de) eintragen. Die Verwendung von Variablen ist hier nicht möglich.

Quellen

Apache Module mod_vhost_alias

Schreibe einen Kommentar

Mit Absenden des Kommentars akzeptieren Sie die Datschutzerklärung.
Ihre 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.