Sometimes I write things, sometimes I don't.

To content | To menu | To search

Apache 2 : mod_macro

internet.pngIl y a des logiciels, des outils, des modules ou on sait directement que l’on ne pourra plus s’en passer. Soit parce que c’est génial et révolutionnaire soit par ce que c’est très pratique et qu’il fallait y penser. C’est exactement ce que je me suis dis en découvrant le mod_macro pour Apache 2. Il y a quelques semaines je ne soupçonnais par l’existence d’un tel module. On m’en a parlé, j’ai laissé mariner et puis j’ai finalement mis la main à la pâte. Et là j’en ai eu la larme à l’œil. Combien de fois je me suis arraché les cheveux sur ma configuration de Apache, combien de copier/coller de virtual hosts j’ai fait… Avec mod_macro tout ça c’est terminé.

Pour résumer, ce module permet de factoriser sa configuration de Apache. On définit des macros puis on les appelle un peu comme les fonctions avec un langage de scripts. On peut faire des macros pour plus ou moins tout ainsi en organisant bien son système et en sachant factoriser sa configuration correctement on peut grandement se simplifier la vie.

Pour installer le mod_macro sur Debian et dérivées, rien de plus simple :
# aptitude install libapache2-mod-macro
# a2enmod macro


Ensuite, il s’agit de ne pas faire n’importe quoi. Afin de gérer mes macros, j’ai créé un fichier macro.conf dans le répertoire /etc/apache2/conf.d/ qui est chargé au démarrage de Apache. Comme je l’ai dit précédemment, on peut se servir des macros pour faire énormément de choses donc je n’aborderai pas tout ici.

Admettons que nous disposons des 2 hôtes virtuels suivants (exemple bidon mais c’est pour montrer le principe) :
<VirtualHost [ipv6]:80 ipv4:80>
  DocumentRoot /var/www/toto
  ServerName   toto.domaine.tld
  ServerAlias  toto.domaine.tld
  ServerAdmin  admin@toto.com

  ErrorLog     /var/log/apache2/toto_error.log
  TransferLog  /var/log/apache2/toto_access.log
</VirtualHost>


<VirtualHost [ipv6]:80 ipv4:80>
  DocumentRoot /var/www/titi
  ServerName   titi.domaine.tld
  ServerAlias  titi.domaine.tld
  ServerAdmin  admin@titi.com

  ErrorLog     /var/log/apache2/titi_error.log
  TransferLog  /var/log/apache2/titi_access.log
</VirtualHost>


Il y a quand même pas mal de points communs entre ces 2 hôtes virtuels. Imaginez s’il y en avait 20 comme ça, la configuration devient vite lourde à gérer. Avec une seule et unique macro on va bien se simplifier la vie. Dans le fichier /etc/apache2/conf.d/macro.conf on écrit donc la macro suivante :
<Macro Domain $sub $domain $root>
  DocumentRoot /var/www/$root
  ServerName   $sub.$domain
  ServerAlias  $sub.$domain
  ServerAdmin  admin@$domain

  ErrorLog     /var/log/apache2/$domain_error.log
  TransferLog  /var/log/apache2/$domain_access.log
</Macro>


Vous voyez le principe. On regroupe les éléments communs aux hôtes virtuels pour les mettre dans une macro qui s’appelle Domain et qui prend 3 paramètres sub, le sous-domaine à utiliser, domain, le domaine à utiliser, et root le répertoire où se trouve les fichiers à rendre disponible sur le web.
Le fichier contenant les virtual hosts peut alors se simplifier en :
<VirtualHost [ipv6]:80 ipv4:80>
  Use Domain toto domaine.tld rep_toto
</VirtualHost>

<VirtualHost [ipv6]:80 ipv4:80>
  Use Domain titi domaine.tld rep_titi
</VirtualHost>


L’utilisation de la macro se fait avec la syntaxe très script-like Use NomMacro [paramètres]. Il faut impérativement donner tous les paramètres à la macro sans quoi la vérification de la configuration échouera.

L’exemple d’utilisation donné ici est simple mais on peut faire des choses plus complexes en utilisant des macros dans d’autres macros, etc… Il faut juste trouver la configuration qui convient le mieux pour son serveur. En tout cas je ne me séparerai plus du mod_macro que je trouve vraiment intéressant pour gérer les hôtes virtuels (chose que je trouve très ennuyante).