Apache et virtualhosts

Apache2 et VirtualHosts pour multi-site

Connaître l’architecture du site

Pour une installation optimale “best-practice”, il est conseillé de créer vos sites dans le dossier /var/www, en nommant chaque site avec leur nom de domaine respectifs.

1. Architecture multi-site recommandée :

Pour les nouveaux sites édités sur frameworks comme Symfony ou Laravel, on retrouve bien souvent la structure suivante :

/var/www
--/monsite1.fr
----/dossiers-moteur-du-site
----/public_html
--/monsite2.fr
----/dossiers-moteur-du-site
----/public_html

Tout d’abord, chaque site comprend un ou plusieurs dossiers moteur. Ces dossiers sont utilisés pour le fonctionnement du site en lui-même : Controllers, Modèles, Vues (MVC), etc… Et ne sont pas / ne doivent pas être visibles en public.

Ensuite, on retrouve généralement un dossier public_html (ou équivalent) dans lequel on va plutôt retrouver cette fois-ci les assets Javascript, CSS ainsi que les images et médias. Ce dossier est publiquement visible puisque l’ont souhaite bien souvent faire des liens vers ces ressources :

Exemple : monsite1.fr/img/mon-image.png

Cependant tous les sites ne sont pas construits via des frameworks MVC, et il existe aussi d’autres sites “faits maison” plus ou moins anciens, et ayants leur propres structures.

2. Architecture multi-site simple

Ici, dans des sites simples plus classiques, on va bien souvent retrouver une structure plus minimaliste composée uniquement d’un dossier racine et de plusieurs dossiers / fichiers mis “en vrac” :

/var/www
--/monsite1.fr
----/dossiers-moteur-fichiers-et-assets-du-site
--/monsite2.fr
----/dossiers-moteur-fichiers-et-assets-du-site

D’un point de vue sécurité, ce n’est pas la solution que je recommande puisque tous vos fichiers sont accessibles en public. Il faudra jouer sur les .htaccess, VirtualHosts et robots.txt pour interdire l’accès à certains dossiers sensibles et éviter l’exploration / indexation de toutes vos ressources.

Néanmoins cette architecture a l’avantage d’être plus simple et plus rapide si vous devez migrer des sites ayants déjà cette structure, ou si votre site n’a pas de fonctionnalités à risques. Par exemple les sites ayant un contenu “vitrine” comme les one-page, ou sites possédant quelques pages statiques en HTML.

3. Architecture multi-site atypique et plus ancienne

Enfin un dernier cas de multi-site plus atypique qui possède un site web principal et en son sein, des sous-dossiers contenant l’ensemble des sites enfants :

/var/www
--/siteprincipal.com
----/dossiers-fichiers-et-assets-du-site
----/dossiers-moteur-du-site
----/monsite1.fr
------/dossiers-fichiers-et-assets-du-site
----/monsite2.fr
------/dossiers-fichiers-et-assets-du-site

Création des VirtualHosts sur Apache2

La création des VirtualHosts se fait toujours dans le dossier /etc/apache2/sites-available. Dedans, on créé un ou plusieurs fichiers en .config dans lesquels vont être placés les VirtualHosts. Il existe deux possibilités :

  • Un seul et unique fichier de config pour tous les Virtualhosts :
    • + Un seul fichier à gérer en cas de modifs
    • + Facilement gérable pour quelques sites
    • + Facile d’installer un seul certificat SSL comprenant tous les sites
    • – Fichier qui peut très vite devenir brouillon
    • – Risques de conflits s’il on installe un certificat SSL par site via certbot
  • Un fichier de config par Virtualhost :
    • + Chaque fichier est clairement identifiable au site qui lui correspond
    • + Plus propre et plus lisible
    • + Pas de conflit SSL avec certbot
    • – Galère à modifier si beaucoup de sites

Il n’y a pas de meilleure solution. Mais en ce qui me concerne, je privilégie toujours un fichier de config par VirtualHost puisque je vais utiliser CertBot pour générer un certificat SSL par site. C’est cette méthode que nous allons voir.

Création des VHs en ligne de commande

Une multitude d’articles existent pour créer des VirtualHosts. Comme il ne s’agit pas de ré-inventer la roue, je vous mets les principaux liens qui m’ont servi :

A noter que la plupart des tutoriels ci-dessus intègrent un dossier public_html pour chacun de leur site. Or, cela correspondrait plutôt à l’exemple 1..

Si vous avez plutôt une structure 2. voir 3., et que vous ne pouvez pas adapter l’architecture des sites, pas de panique, déclarez simplement le nom de domaine en tant que DocumentRoot :

DocumentRoot /var/www/monsite1.fr

Et déclarez vos directives de dossier/fichiers dans un ou plusieurs <Directory> ou <Files>. Exemple :

# Interdit l'accès à l'ensemble des éléments du dossier monsite1.fr
# -Indexes : Interdit le listing des répertoires
# +FollowSymLinks : Suit les liens symboliques
<Directory /var/www/monsite1.fr>
AllowOverride All
Order Deny, Allow
Deny from All
Options -Indexes +FollowSymLinks
</Directory>

# Mais on peut par exemple autoriser l'accès à un sous-dossier spécifique de monsite1.fr
<Directory /var/www/monsite1.fr/dossier-public>
AllowOverride All
Order Allow, Deny
Allow from All
</Directory>

Vous pouvez aussi très bien autoriser tout le site et interdire quelques dossiers sensibles :

# Autorise l'accès à l'ensemble des éléments du dossier monsite1.fr
# -Indexes : Interdit le listing des répertoires
# +FollowSymLinks : Suit les liens symboliques
<Directory /var/www/monsite1.fr>
AllowOverride All
Order Allow, Deny
Allow from All
Options -Indexes +FollowSymLinks
</Directory

Puis mettre une directive restrictive en ciblant un dossier spécifique, ou encore, mettre un .htaccess dans chaque dossier concerné.

Une fois votre VirtualHost réalisé, n’oubliez pas de l’activer via un lien symbolique vers le dossier /etc/apache2/sites-enabled :

sudo ln -s /etc/apache2/sites-available/monsite1.fr.conf /etc/apache2/sites-enabled/monsite1.fr.conf

Ou via a2ensite :

 sudo a2ensite monsite1.fr.conf

Et de redémarrer Apache :

sudo service apache2 restart

Une fois fait, le site est en ligne ! Faîtes exactement la même procédure pour l’ensemble de votre multi-site en adaptant bien sur à l’arborescence.

Vous souhaitez maintenant installer un certificat SSL pour vos sites ? C’est par ici. [bientôt]

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.