Le module userdir du serveur web Apache httpd permet à chaque utilisateur d'un serveur d'héberger un site web dans son dossier personnel ($HOME). Celui-ci sera accessible à l'URL https://www.monorganisation.example/~<IDENTIFIANT_UTILISATEUR>
.
Du moins, ça c'est la théorie. J'ignorais la grande flexibilité de mod_userdir :
Nous avons un serveur Debian GNU/Linux sur lequel tous nos utilisateurs peuvent se connecter en SSH et déposer des pages web (entre autres choses).
Deux espaces de stockage sont à leur disposition : leur dossier personnel ($HOME) et leurs données. Les deux sont montés en NFS. Les données sont aussi accessibles en CIFS depuis n'importe quelle machine et n'importe quel système d'exploitation. Le dossier personnel est accessible seulement depuis ce serveur.
Certains utilisateurs veulent modifier leur site web depuis winwin (entre l'encodage des caractères, le codage différent d'un retour à la ligne, et autres fourberies, ce n'est pas une bonne idée, mais je ne suis pas là pour empêcher nos utilisateurs de se faire mal). On va donc stocker les sites web dans l'espace de stockage « données ».
Comment faire ? Simple. Voici le contenu du fichier /etc/apache2/mods-enabled/userdir.conf
:
<IfModule mod_userdir.c>
UserDir disabled root
UserDir /nfs/nas-datas/datas/*/public_html
<Directory /nfs/nas-datas/datas/*/public_html>
AllowOverride All
Options Indexes
Require all granted
</Directory>
</IfModule>
Commentaires :
https://www.monorganisation.example/~<IDENTIFIANT>
, Apache httpd cherchera les fichiers dans le dossier /nfs/nas-datas/datas/<IDENTIFIANT>/public_html
;
Difficulté supplémentaire : en fait, sur notre NAS, pour des raisons de performances, le dossier d'un utilisateur est en fait un sous-dossier d'un dossier qui peut prendre le nom d'un hash ou celui du groupe auquel appartient l'utilisateur (son service, par exemple) ou l'année d'arrivée de l'utilisateur, etc. Pour cet exemple, on considérera que c'est le groupe de l'utilisateur et que celui-ci équivaut à son service.
Comment faire ? Facile. Le module userdir peut chercher le site web dans plusieurs dossiers en s'arrêtant à la première occurrence trouvée. Quant à elle, la directive « Directory » autorise plusieurs caractères substituables.
Le contenu du fichier /etc/apache2/mods-enabled/userdir.conf
devient :
<IfModule mod_userdir.c>
UserDir disabled root
UserDir /nfs/nas-datas/datas/info/*/public_html /nfs/nas-datas/datas/compta/*/public_html /nfs/nas-datas/datas/direction/*/public_html
<Directory /nfs/nas-datas/datas/*/*/public_html>
AllowOverride All
Options Indexes
Require all granted
</Directory>
</IfModule>
Allez, une dernière chose : si le site web n'est pas trouvé dans l'espace de stockage « données », on souhaite le chercher dans le dossier personnel.
Ce n'est pas un problème : on peut bien évidemment cumuler les différentes syntaxes de la directive « UserDir » : UserDir /nfs/nas-datas/datas/info/*/public_html public_html
. Dans cet exemple, Apache httpd ira chercher dans le dossier /nfs/nas-datas/datas/info/<IDENTIFIANT>/public_html
et, si ce dossier n'existe pas, il ira chercher dans le dossier public_html du home directory (qui n'est pas toujours /home/<IDENTIFIANT>
, pour rappel).
Évidemment, pour que cela fonctionne, il faut ajouter une directive « Directory » supplémentaire autorisant l'accès au dossier « public_html » situé dans le $HOME. Exemple :
<Directory /nfs/nas-homedir/homedirs/*/*/public_html>
AllowOverride All
Options Indexes
Require all granted
</Directory>