hood

Comment fonctionne Drupal Multisite en coulisses

Un multisite Drupal est une installation qui nous permet d'utiliser une seule base de code pour desservir plusieurs sites web. Dans cet article, je vais expliquer en détail comment fonctionne le multisite Drupal, quelles approches peuvent être adoptées pour configurer une installation multisite. Je vais également expliquer certains des réglages qui peuvent être importants pour un multisite et qui ne s'appliquent pas lorsque nous construisons un seul site web sur Drupal.

Les bases d'un multisite Drupal par défaut

Un site web Drupal comprend quelques éléments majeurs :

  1. Noyau de Drupal
  2. Modules contrib et personnalisés
  3. Thème
  4. Base de données
  5. Configuration

Lorsqu'une requête du navigateur est traitée par Drupal, une des premières actions de Drupal est l'initialisation de la base de données et le chargement de la configuration. Depuis la base de données et la configuration, le système sait :

  • quels modules et thèmes disponibles sont activés,
  • comment tout est configuré :
    • où se trouvent les dossiers de fichiers publics et privés,
    • quels blocs sont où,
    • quel contenu est disponible,
    • ce qui est sur la page d'accueil,
    • quels menus sont dans quelles régions, quels liens sont dans quels menus, 
    • pratiquement tout le reste sur la configuration du site web. 

Pour se connecter à la base de données, Drupal lit les informations de connexion qui sont contenues dans le fichier settings.php (qui se trouve généralement dans le dossier /sites/default).

Notez le dossier default. Il est appelé default parce qu'il est un dossier de secours lorsqu'aucun autre dossier n'est trouvé. Dans une installation unique de Drupal, il n'y a généralement pas d'autres dossiers configurés et la plupart des sites web fonctionnent depuis le dossier par défaut.

Dans une installation multisite, cependant, nous configurons des dossiers séparés pour des sites web distincts.

Par exemple :

  • /sites/example-one.com
  • /sites/example-two.com

Si nous créons de tels dossiers, une nouvelle requête examinera le domaine de base (URL de base comme l'appelle Drupal) et essayera de le faire correspondre au dossier correct. L'ordre est le suivant :

Quand une requête avec l'URL de base www.example-one.com arrive, Drupal vérifie s'il y a :

  1. Un dossier nommé /sites/www.example-one.com et cherche le settings.php là-bas.
  2. S'il n'y en a pas, Drupal vérifiera un dossier de domaine supérieur - /sites/example-one.com dans ce cas. 
  3. S'il ne trouve pas settings.php là-bas, il passera au /sites/default.

Nous avons atteint un multisite - plusieurs sites web sur une seule base de code

Si nous avons 2 dossiers pour 2 domaines différents, nous pouvons avoir 2 fichiers settings.php séparés qui connectent Drupal à deux bases de données distinctes, qui chargent des configurations séparées et utilisent différents modules et thèmes activés.

En essence, nous finissons avec 2 sites web différents, qui ont leurs propres bases de données, contenu, fichiers et configurations, même s'ils sont assis sur un seul code Drupal.

Si nous ajoutons des dossiers supplémentaires, nous obtenons des sites web supplémentaires sans avoir besoin de dupliquer le code.

Drupal peut faire fonctionner des centaines de sites web à partir d'une installation comme celle-ci.

Le fichier sites.php aide à mapper les domaines pour les dossiers

Pour aider au mappage des URL de base vers les dossiers, Drupal propose un fichier sites.php qui peut être utilisé pour assigner les URL de base aux dossiers corrects.

Dans le dossier /sites/ on nous propose un fichier qui s'appelle example.sites.php. Changez son nom en sites.php et Drupal l'utilisera. La configuration du mappage est assez simple :

$sites['an-old-domain-to-map.coom'] = 'example-one.com;'; 

Ce fichier nous permet de mapper plusieurs domaines à un site web si besoin est et aide beaucoup dans le développement car les environnements de développement ont généralement des URLs différentes de celles de production.

$sites['localhost.example'] = 'example.com';

Certaines équipes de développement utilisent également cette fonctionnalité pour garder le dossier sites plus clair lorsque des centaines de sites web doivent être gérés avec des domaines variés parfois dans des langues étrangères. L'équipe de développement peut avoir des noms de dossier clairs et courts.

$sites['nom-de-domaine-de-marque-tres-long.fr'] = 'brand-x-fr';

Cela est également parfois utile si le domaine pour un des sites web change.

Quel site web peut utiliser quels modules

Typiquement, nous sommes habitués à une situation où

  • tous les modules sont placés dans le répertoire de modules (ou sites/all/modules dans Drupal 7 et les versions précédentes),
  • tous les thèmes sont placés dans le répertoire de thèmes (ou sites/all/themes dans Drupal 7 et les versions précédentes).

Si nous avons un seul site web sur le système, il n'y a pas besoin d'autre configuration. Nous ajoutons seulement les modules dont nous avons besoin.

Dans une installation multisite, cependant, il peut être nécessaire de spécifier quels sites web peuvent utiliser quels modules ou thèmes. Dans un grand système avec des centaines de sites web et d'administrateurs, de telles restrictions peuvent être cruciales pour n'autoriser que les fonctionnalités qui fonctionnent bien ensemble sur chaque site.

Nous pouvons contrôler cela de 2 manières :

1. Via des profils d'installation

Chaque site web sur Drupal est construit sur un profil d'installation. Typiquement c'est le profil standard ou minimal fourni par Drupal par défaut. Vous le choisissez lors de l'installation de Drupal et vous pouvez les voir dans le dossier /core/profiles. Aucun de ces 2 profils n'a de modules ou thèmes mais un profil peut en fournir.

Drupal, par exemple, est livré avec un profil demo_umami qui est un profil de démonstration et inclut à la fois : un module demo_umami_content et un thème umami. Si vous installez une installation standard, vous n'aurez pas accès au thème umami depuis le panneau d'administration par exemple.

Si vous devez contrôler quels sites web ont accès à quels thèmes ou modules, placez-les dans vos profils d'installation personnalisés. Seuls les sites web installés sur un profil d'installation particulier pourront accéder et utiliser ce qu'il fournit.

Ce qui est intéressant, c'est que les profils permettent l'héritage. Vous pouvez, par exemple, créer un profil avec des modules de commerce Drupal puis 2 profils enfants supplémentaires qui pourront accéder aux modules de commerce de Drupal.

En offrant des services Drupal pour nos clients, nous avons mis en œuvre divers scénarios avec différents niveaux de granularité. Vous pourriez même créer un profil enfant pour chaque site web pour permettre un contrôle très granulaire. Cela pourrait cependant être un peu exagéré.

2. Modules par site via le dossier du site

Les modules et thèmes peuvent également être ajoutés au dossier du site. Dans notre exemple, nous pourrions les mettre dans :

  • sites/example-one.com/modules
  • sites/example-one.com/themes

Les modules et thèmes placés dans ces répertoires ne seront disponibles que pour le site web example-one.com.

En général, vous devriez probablement éviter d'avoir trop de modules ici car cela va probablement à l'encontre du concept de multisite d'avoir un code complètement différent pour chaque site web, mais parfois il est nécessaire d'ajouter quelques ajustements par site web ou de créer un sous-thème pour un site web qui remplace quelques éléments dans un thème de base partagé.

Mettre à jour le code une fois, exécuter la mise à jour 100 fois

Un des grands avantages d'un multisite est la réduction de la maintenance. Si vous avez 100 sites web sur un système et qu'une nouvelle version de Drupal est publiée, vous n'avez besoin de mettre à jour le code qu'une seule fois au lieu de 100 fois.

Cela dit, rappelez-vous que les réglages et les bases de données sont séparés pour les 100 sites web. Vous devez exécuter le script update.php pour chacun séparément !

Résumé

Ci-dessus, j'ai expliqué en détail comment fonctionne Drupal multisite sous le capot. En essence, c'est une fonctionnalité très simple et pourtant puissante de Drupal qui permet aux entreprises de réduire les coûts de maintenance et la dette technique et de maintenir la santé mentale des mainteneurs s'ils ont à gérer de nombreux sites web.

As part of Drupal support, we maintain existing websites and expand them with new functionalities