Deblan blog

Domaines de développement - Apache2

Aujourd'hui j'ai eu besoin d'une configuration particulière d'Apache : j'ai décidé que les sous-domaines de deblan.org de type "dev-XXX" devaient être gérés de tel sorte que "XXX" corresponde à un sous-répertoire de dev.deblan.org. Ainsi, dev-01.deblan.org est l'équivalent de dev.deblan.org/01/.

Jusque là, rien de bien méchant sauf que j'ai une contrainte : je souhaite que ce soit automatique (ou le plus possible). Donc je ne souhaite pas ajouter/modifier des Virtualhost, je veux qu'un sous-domaine puisse être supprimé dans me prendre la tête.

La solution est au final simple (mais un peu tordue) :

Etape 1. Créer un fichier de mapping

L'idée est la suivante : comme tout ne sera pas automatique, je m'autorise l'édition d'un seul fichier pour traiter la correspondance d'un nom et de son répertoire de destination (en quelque sorte son DocumentRoot).

Ce fichier sera placé à la racine du compte associé à dev.deblan.org. Sur mon serveur, c'est le chemin suivant :

/services/web/www/dev-xx.deblan.org/vhost.map

Ce fichier contient ces informations :

dev.deblan.org /var/www/service-web/www/dev-xx.deblan.org/public_html/
dev-01.deblan.org /var/www/service-web/www/dev-xx.deblan.org/public_html/01
dev-foo.deblan.org /var/www/service-web/www/dev-xx.deblan.org/public_html/foo

On a donc à gauche le nom de domaine et à droite le répertoire web associé.

A travers une connexion au compte dev.deblan.org (via SSH ou en FTP par exemple), je peux modifier ce fichier.

Etape 2. Création du VirtualHost d'Apache
<VirtualHost *:80>
	# On définit le domaine de base
	ServerName dev.deblan.org
	# On indique les alias de domaine à prendre en compte 
	ServerAlias dev-*.deblan.org

	# La partie la plus importante : les règles qui permettront de traiter ma demande
	RewriteEngine on

	# C'est ici que tout se passe
	RewriteMap lowercase int:tolower
	# On charge le fichier pour le mapping
	RewriteMap vhost txt:/services/web/www/dev-xx.deblan.org/vhost.map
	# On prend le soin de travailler de tout mettre en minuscules (donc attention à la casse !)
	RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
	RewriteCond ${vhost:%1} ^(/.*)$
	# On "simule" le DocumentRoot du domaine
	RewriteRule ^/(.*)$ %1/$1

	[...]
</VirtualHost>
Etape 3. Création d'un script de mise à jour d'Apache

Le fichier de mapping n'est chargé qu'une seule fois et c'est quand on relance ou reload Apache. Il faut donc, à des temps réguliers, vérifier si le fichier de mapping a été modifié et si on doit relancer Apache.

Il existe plusieurs méthodes, moi je vous propose un truc très simple :

(Fichier /root/apache2/reload)

#!/bin/sh

# On indique le fichier de mapping
MAPPING=/services/web/www/dev-xx.deblan.org/vhost.map

# On indique le fichier qui va contenir le retour de "ls -l" sur le fichier de mapping
LS_FILE=/root/apache2/ls

[ -f "$LS_FILE" ] || touch "$LS_FILE"

LS=$(ls -l "$MAPPING")

# Si il y une différence entre le "nouveau" ls et l'ancien ls, alors le fichier à été modifié
# Donc on relance apache et on met à jour $LS_FILE
if [ "$LS" != "$(cat "$LS_FILE")" ]; then
	/usr/sbin/service apache2 reload
	echo "$LS" > "$LS_FILE"
fi

Il ne vous reste plus qu'à placer ça dans un crontab avec par exemple cette ligne de conf :

*/1 * * * * /root/apache2/reload 2>&1 >/dev/null

Ici le script est exécuté toutes les minutes.

Normalement tout devrait fonctionner :)

Si vous avez d'autres solutions, je suis prenneur !


Ajouter un commentaire

Vous pouvez utiliser du markdown.Afficher l'aide.