13.052015

Apache mod_macro

Mod_macro

Viele vHosts unter Apache2 mit gleichen Settings zu managen kann mitunter schwer sein, zumal es mal einen Host gibt, der aufgrund  mehrerer Domains zum Beispiel nicht mehr mit den anderen Hosts über einen Kamm zu scheren ist. Wie man viele Apache virtualhosts (quasi) in einem Schema verpacken kann und leicht verwaltet, zeige ich Dir mit dem Apache2 Modul 'mod_macro'.

Voraussetzungen

Die Verwaltung von virtualHosts mit mod_macro setzt voraus, das eben dieses Modul im Apache Webserver aktiviert und konfiguriert ist. Zunächst muss also, wenn das Modul noch nicht aktiviert ist, der Befehl zur Aktivierung des Moduls ausgeführt werden. Ich befinde mich auf einem Ubuntu 15.04 Server und der Befehl für die Aktivierung des Moduls sieht so aus:

a2enmod mod_macro

Ohne flexible Makros kein Vorteil

Weil wir unter Umständen viele Seiten auf einem Webserver laufen lassen möchten, wollen wir nun das normale Konfigurationsset von Virtualhosts als Makro definieren. Wichtig ist hier, wie auch bei allen anderen Modul-basierenden Konfigurationen im Apache, dass die Konfiguration nur eingelesen wird, wenn das Modul auch aktiviert ist.

Mit den folgenden Zeilen können wir eine neue Konfigurationsdatei laden, wenn das Modul mod_macro aktiv ist:

<IfModule mod_macro>
    Include mod_macro.conf
</IfModule>

mod_macro.conf

Ich halte gerne die Definition von Makros und deren Verwendung auseinander, deswegen inkludiere ich am Anfang der Datei die Konfigurationsdatei macros.conf. Diese beinhaltet unsere ganzen Makros.

Einfache Makros:

Ein Makro befindet sich in einem Container "Makro" und hat mehrere mit Leerzeichen getrennte Parameter. Die Verwendung und das Erweitern der Parameter ist ziemlich einfach, wenn man es nicht übertreibt. Mehr als vier Parameter werden nicht nur übersichtlich, sondern auch schwer zu ändern, da sich andere Makros oder auch andere Stellen, an denen unser Makro verwendet wird, dann angepasst werden müssen. Auf die Parameter kann innerhalb des Makros zugegriffen werden.

<Macro MAKRONAME $parameter1 $parameter2 [...] $parametern>
    Aktion $parameter1
</Macro>

Mein erstes Makro übernimmt die Ausgabe der verschiedenen Domains und der Server-Aliase. Diese können als Liste im Aufruf des Makros übergeben werden. Warum ich die Definition eines Virtualhosts nun in Bereiche trenne, liegt daran, dass ich verschiedene Hosttypen habe. Es gibt ein anderes Makro, das einen SSL-Host definiert.

<Macro CmsVhHostname $hostname $domains>
    ServerName $hostname
    ServerAlias $domains
    ServerAdmin info@$hostname
</Macro>

Pfade definieren

Dieses Makro gibt ein Pattern aus, das im Virtual Host verwendet wird, um zu zeigen, in welchem Ordner die Website physisch liegt. Hier können auch einige Optionen für das DocumentRoot übergeben werden.

<Macro CmsVhHome $hostname>
    DocumentRoot /var/www/$hostname/htdocs
    <Directory /var/www/$hostname/htdocs>
        AllowOverride All
        Order allow,deny
        Allow from all
        Options -Indexes +FollowSymLinks
    </Directory>
</Macro>

Logging einstellen

Dieses Makro setzt die Pfade zu den Access und Error-Logs des virtuellen Hosts. Passen wir den Ordnerpfad (/var/log/apache/) vor der Logdatei an, können wir die Logfiles leicht im Dateisystem verschieben, ohne jeden Host einzeln zu bearbeiten.

<Macro CmsVhLogging $hostname>
    ErrorLog /var/log/apache/$hostname_error.log
    CustomLog /var/log/apache/$hostname_access.log common
</Macro>

Host zusammenbauen

Wir haben nun ein Makro erstellt, das uns die Host-Konfiguration übernimmt. Ein weiteres übernimmt die Einstellungen für das Home-Directory und unser drittes Makro übernimmt die Konfiguration des Loggings. Für eine Sammlung kleiner Seiten, ohne große Unterschiede untereinander, können wir nun ein letztes Makro erstellen. Das folgende Makro verwendet wiederum unsere vorher definierten Makros, um einen kompletten Virtuellen Host zusammenzusetzen. Das hier ist ein Beispielhost, der ohne SSL funktioniert.

<Macro CmsVhHostHTTP $hostname $domains $ipaddress>
    <VirtualHost $ipaddress:80>
        Use CmsVhHostname $hostname $domains
        Use CmsVhHome $hostname
        Use CmsVhLogging $hostname
    </VirtualHost>
</Macro>

Virtuelle Hosts mit Makros anlegen

Im letzten Schritt müssen wir nur noch das letzte Makro verwenden. Wir beginnen die Zeilen also mit

Use NAME_DES_MACROS PARAMETER1 PARAMETER2 [...] PARAMETERn

Ein wenig Umständlich aber für den Nutzen nicht weiterhin tragisch ist das Zusammensetzen von mehreren Hostnamen als Liste. Da das Modul mod_macro die Leerzeichen der Liste als Trennung zwischen einzelnen Parametern erkennen würde, müssen wir nun die Leerzeichen mit \s ersetzen.

Die fertige mod_macro.conf

Include macros.conf
#hostnames:
Use CmsVhHostHTTP hauptdomain.de www.hauptdomain.de\ssekundaerdomain.de\swwwsekundaerdomain.de 127.0.0.1
Use CmsVhHostHTTP seite.de www.seite.de\sseite.com\swww.seite.com 127.0.0.1

Apache neu starten

Wenn nun alles stimmt, kann mit dem folgenden Befehl der Apache2 Webserver neu gestartet werden und die Konfiguration macht die verschiedenen Seiten verfügbar.

service apache2 stop && service apache2 start