Christian Seiler: Christians Servertipps #2: mod_macro, vhosts, includes

Hallo allerseits,

Hier kommt nun die zweite Ausgabe von Christians Servertipps. Für alle die, die's noch nicht wissen: Ich missbrauche das Forum ab sofort als Blog. ;-)

Letztes Mal habe ich etwas über die Einbindung von PHP in Apache gesprochen, heute möchte ich eher um die Apache-Konfiguration allgemein sprechen.

Zuerst möchte ich ein Modul vorstellen, von dem wohl die wenigsten gehört haben (weil's nicht zum Standardumfang von Apache gehört und auch nicht gehören wird), das aber EXTREM nützlich sein kann: mod_macro. (Viele Linux-Distributionen bieten bereits fertige Pakete für das Modul an.) Mit dem Modul kann man sich "Macros" definieren, die man dann an beliebige Stellen im Sourcecode einfügen kann.

Beispielsweise kann ich folgendes Macro defineren:

<Macro VHost $name $admin $docroot>  
<VirtualHost *:80>  
  ServerName $name  
  ServerAdmin $admin  
  
  DocumentRoot $docroot  
  
  <Directory $docroot>  
    Order allow,deny  
    Allow from all  
    AllowOverride AuthConfig  
    Options Indexes MultiViews SymLinksIfOwnerMatch  
  </Directory>  
  
  ErrorDocument 403 /fehler/fehler403.htm  
  ErrorDocument 404 /fehler/fehler404.htm  
</VirtualHost>  
</Macro>

Nun kann man auf sehr einfache Art und Weise sich massenhaft virtuelle Hosts, die im Endeffekt identisch konfiguriert sind, auf einmal anlegen:

Use VHost www.example.com admin@example.com /srv/www/example.com  
Use VHost test1.example.com admin@example.com /srv/www/test1.example.com  
Use VHost test2.example.com admin@example.com /srv/www/test2.example.com

Nett, nicht wahr?

Natürlich funktioniert das nicht nur für virtuelle Hosts, man kann in <Macro> so ziemlich jede erlaubte Konfigurationsanweisung packen.

Nun möchte ich jedoch noch eins draufsetzen. Benjamin (Chatbesucher werden ihn kennen ;-)) hatte nämlich im Chat vor einiger Zeit ein Problem: Er wollte VHosts über obige Methode mit mod_macro definieren, wollte jedoch bei einigen VHosts Ausnahmen machen, d.h. die Konfiguration in Teilen verändern. Da stellt sich die Frage: Wie realisiert man sowas sinnvoll?

Mein Vorschlag war, dies über Includes zu machen: das Macro, das den virtuellen Host definiert, bindet einfach per Include (das ist eine Standard-Apache-Konfigurationsanweisung) eine Konfigurationsdatei ein, die so benannt ist, wie der virtuelle Host selbst. Also würde man zum Beispiel sowas machen:

<Macro ... $name ...>  
<VirtualHost *:80>  
# Standardeinstellungen  
  
Include /pfad/zu/$name.conf  
</VirtualHost>  
</Macro>

Und dann in den Dateien wie test1.example.com.conf die lokalen Einstellungen für den virtuellen Host.

Dabei tritt jedoch ein Problem auf: Für jeden virtuellen Host muss nun eine Konfigurationsdatei existieren (selbst wenn diese vollkommen leer ist) - sonst will der Apache nicht mehr starten. Das ist natürlich bei vielen virtuellen Hosts, von denen man nur bei wenigen von der Standardkonfiguration abweichen will, nicht praktikabel.

Nun gibt es einen einfachen Ausweg aus diesem Dilemma: Wildcards. Die in meinen Augen sinnvollste Form geht auf Benjamin zurück und sieht so aus:

Include /pfad/zu/$name.?onf

Das Fragezeichen bewirkt, dass der Apache anfängt, mit Wildcards Dateien zu matchen. Wenn er das jedoch tut, dann ist es kein Fehler mehr, wenn die Wildcards mit gar keiner Datei übereinstimmen - dann wird einfach nichts eingebunden. Und wenn sie mit einer Datei übereinstimmen, wird eben diese eingebunden.

Das Fragezeichen matcht nun auf ein beliebiges Zeichen - insbesondere eben auch auf 'c', das in 'conf' vorkommt. Natürlich würde der Ausdruck auch auf eine Datei example.com.Monf matchen - aber mal ehrlich: wer benennt seine Dateien schon so? ;-) Dafür sorgt der Pattern im Gegensatz zu *$name.conf oder $name.conf* dafür, dass es keine Überschneidungen mit Subdomains und/oder Backup-Dateien (manche Editoren legen beim Speichern der Datei 'foo' gerne eine Datei namens 'foo~' an).

Somit kann man sich also mit mod_macro die Konfiguration insbesonderer vieler virtueller Hosts stark vereinfachen, ohne die Flexibilität einer individuellen Konfiguration für bestimmte virtuelle Hosts zu verlieren.

Viele Grüße,
Christian

  1. Für alle die, die's noch nicht wissen: Ich missbrauche das Forum ab sofort als Blog. ;-)

    Schade, dass du kein Blog hast. Dann könnten wir das als Forum missbrauchen.

  2. n'abend,

    Hier kommt nun die zweite Ausgabe von Christians Servertipps. Für alle die, die's noch nicht wissen: Ich missbrauche das Forum ab sofort als Blog. ;-)

    (#selfhtml)<Tim> Chris, Deinem Blog könntest Du noch Tags hinzufügen. In die Signatur "tag:foo" und so hinzufügen. ;)

    *scnr*

    weiterhin schönen abend...

    --
    Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|