SPIP

[ar] [ast] [bg] [br] [ca] [co] [cpf] [cs] [da] [de] [en] [eo] [es] [eu] [fa] [fon] [fr] [gl] [id] [it] [ja] [lb] [nl] [oc] [pl] [pt] [ro] [ru] [sk] [sv] [tr] [uk] [vi] [zh] Espace de traduction

Télécharger

Mutualisation : un SPIP pour plusieurs sites

Juillet 2010 — mis à jour le : Février 2013

Toutes les versions de cet article :

Partager les fichiers de SPIP entre plusieurs sites, ce que l’on appelle une mutualisation, permet un gain d’espace disque important, ainsi qu’une possibilité de mise à jour de SPIP simple de l’ensemble des sites en ne mettant à jour que le noyau.


SPIP permet de mutualiser ses fichiers depuis SPIP 1.9. Au fil des versions les procédures se clarifient et deviennent plus robustes [1].

Le concept...

Depuis SPIP 1.9.2 les dossiers nécessaires au fonctionnement du noyau SPIP (ecrire, prive, dist (devenu squelettes-dist en 2.0)), et ceux marquant l’activité d’un site (config, IMG, tmp, local) sont clairement identifiables et séparés [2]. C’est cette séparation qui permet d’avoir plusieurs sites SPIP autonomes pour un même noyau de SPIP.

Cette autonomie repose sur quatre répertoires par site dans lesquels SPIP va écrire les données résultant de l’activité du site. On distingue les données temporaires et permanentes d’une part, et les données accessibles par HTTP et celles qui ne le sont pas d’autre part. Les deux répertoires inaccessibles par HTTP seront protégés par un .htaccess installé automatiquement par SPIP (les administrateurs du serveur peuvent mettre ces répertoires en dehors de l’arborescence servie par HTTP).

Ces quatre répertoires sont distincts et nommés par les constantes PHP suivantes :

define('_NOM_TEMPORAIRES_INACCESSIBLES', "tmp/");
define('_NOM_TEMPORAIRES_ACCESSIBLES', "local/");
define('_NOM_PERMANENTS_INACCESSIBLES', "config/");
define('_NOM_PERMANENTS_ACCESSIBLES', "IMG/");

Dans une installation simple de SPIP, ces répertoires sont créés à la racine du site avec les valeurs par défaut ci-dessus. La mutualisation des sources de SPIP repose sur l’association de quatre répertoires spécifiques à chaque site, déduits de leurs URL.

Initialisation de la mutualisation

Cette association est effectuée par une fonction, spip_initialisation. Elle admet quatre arguments indiquant la localisation des quatre répertoires fondamentaux, et construit à partir de ceux-ci les constantes servant au fonctionnement de SPIP. Dans une installation simple, ces quatre arguments sont les quatre constantes ci-dessus. La fonction spip_initialisation est appelée juste après le chargement de mes_options.php, et refuse silencieusement de s’exécuter si elle a déjà été appelée. En conséquence, si dans ce fichier cette fonction est appliquée sur des arguments différents déduits de l’URL du site, on aura autant d’utilisation des sources de SPIP que d’URL de site. On peut aussi définir dans ce fichier les constantes servant au fonctionnement de SPIP, ces définitions ayant priorité sur celles qu’essaiera de définir spip_initialisation.

Le code ci-dessous, placé dans le fichier config/mes_options.php prend le nom de domaine et exécute une mutualisation sur les quatre répertoires tmp, local, config et IMG placés dans le dossier sites/nom_du_domaine/. Auparavant, la définition de quelques constantes permet de centraliser les fichiers de journalisation de tous les sites dans un unique répertoire, log, et non dans sites/nom_du_domaine/tmp/ pour chacun. Cette centralisation n’a rien d’obligatoire mais se révèle utile ; elle peut s’appliquer aussi aux répertoires d’aide et de sauvegarde.

  1. <?php
  2. $rep = 'sites/';
  3. $site = $_SERVER['HTTP_HOST'];
  4. $path = _DIR_RACINE . $rep . $site . '/';
  5.  
  6. // ordre de recherche des chemins
  7. define('_SPIP_PATH',
  8.         $path . ':' .
  9.         _DIR_RACINE .':' .
  10.         _DIR_RACINE .'squelettes-dist/:' .
  11.         _DIR_RACINE .'prive/:' .
  12.         _DIR_RESTREINT);
  13.  
  14. // ajout du dossier squelette
  15. if (is_dir($path . 'squelettes'))
  16.         $GLOBALS['dossier_squelettes'] = $rep . $site . '/squelettes';
  17.  
  18. // exemple de logs a la racine pour tous les sites
  19. define('_FILE_LOG_SUFFIX', '_' . $site . '.log');
  20. define('_DIR_LOG',  _DIR_RACINE . 'log/');
  21.  
  22. // prefixes des cookie et des tables :
  23. $cookie_prefix = str_replace('.', '_', $site);
  24. $table_prefix = 'spip';
  25.  
  26. // exectution du fichier config/mes_option.php du site mutualise
  27. if (is_readable($f = $path . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php'))
  28.         include($f);
  29.  
  30. // demarrage du site
  31. spip_initialisation(
  32.         ($path . _NOM_PERMANENTS_INACCESSIBLES),
  33.         ($path . _NOM_PERMANENTS_ACCESSIBLES),
  34.         ($path . _NOM_TEMPORAIRES_INACCESSIBLES),
  35.         ($path . _NOM_TEMPORAIRES_ACCESSIBLES)
  36. );
  37. ?>

Mutualiser des domaines ou des sous-domaines

Pour mutualiser plusieurs domaines ou sous-domaines, vous devez tous les diriger vers le répertoire physique contenant SPIP. Par exemple, http://example.org/, http://example.net/ et http://sous_domaine.example.net/, pour les mutualiser, doivent tous pointer sur le même répertoire, comme /var/www/spip/.

Ce dossier contient donc SPIP ainsi qu’un fichier config/mes_options.php pour activer la mutualisation. En reprenant l’exemple de code donné au dessus, il faudra alors créer les dossiers sites et log ainsi que sites/example.org, sites/example.net et sites/sous_domaine.example.net avec dans chacun d’eux les répertoires config, local, IMG et tmp accessibles en écriture. Il n’y a rien d’autre à réaliser. En allant sur l’un des sites, SPIP devrait vous proposer son installation.

Si vous souhaitez pouvoir activer des types d’url différents, comme les « url arborescentes » ou les « url propres », il sera nécessaire de créer un fichier d’accès Http, qui est fourni dans la distribution sous le nom de htaccess.txt : il suffit de le renommer en .htaccess pour le mettre en œuvre. Il s’appliquera à tous les sites mutualisés, mais il est possible d’avoir des accès différenciés en configurant astucieusement le serveur (voir plus bas). Dans les deux cas, tout cela ne fonctionnera que si votre serveur accepte d’exécuter toutes les directives présentes dans ce fichier, notamment celles concernant la réécriture d’url (« url rewriting »).

Mutualiser les répertoires d’un domaine

Chaque dossier (virtuel) d’un domaine, en analysant correctement l’URL, peut aussi devenir un site SPIP mutualisé. Il faut pour cela que l’URL du dossier soit redirigée de façon transparente vers la racine du SPIP. C’est le rôle du fichier .htaccess modifié. Ainsi http://example.com/premier_site/ et http://example.com/second_site/ peuvent être chacun des sites SPIP mutualisés (et http://example.com/ aussi).

Dans un premier temps, il faut renommer le fichier htaccess.txt en .htaccess et le modifier pour indiquer que les répertoires qui sont virtuels doivent pointer à la racine de SPIP. Pour cela, ajouter dans la partie « Réglages personnalisés » soit le code générique qui traite tous les répertoires virtuels (mais http://example.com/premier_site sans / final renverra une erreur), soit un code indiquant les noms des dossiers (pas d’erreur si aucun / final) :

Dans un second temps, il faut créer une mutualisation en analysant dans le fichier config/mes_options.php l’url transmise. Voici un exemple pour avoir les sites mutualisés dans sites/exemple.com, sites/premier_site et sites/second_site :

  1. <?php
  2. if (
  3.         (
  4.                 preg_match(',^/([\.a-zA-Z0-9_-]+)/,', $_SERVER['REQUEST_URI'], $r)
  5.                 AND !is_dir(_DIR_RACINE . $r[1])
  6.         )
  7. ) {
  8.         $site = $r[1];
  9. } else {
  10.         $site = $_SERVER['HTTP_HOST'];
  11. }
  12.  
  13. $rep = 'sites/';
  14. $path = _DIR_RACINE . $rep . $site . '/';
  15.  
  16. // ordre de recherche des chemins
  17. define('_SPIP_PATH',
  18.         $path . ':' .
  19.         _DIR_RACINE .':' .
  20.         _DIR_RACINE .'squelettes-dist/:' .
  21.  
  22.  
  23.         _DIR_RACINE .'prive/:' .
  24.         _DIR_RESTREINT);
  25.  
  26. // ajout du dossier squelette
  27. if (is_dir($path . 'squelettes'))
  28.         $GLOBALS['dossier_squelettes'] = $rep . $site . '/squelettes';
  29.  
  30. // prefixes des cookie et des tables :
  31. $cookie_prefix = str_replace('.', '_', $site);
  32. $table_prefix = 'spip';
  33.  
  34. // exectution du fichier config/mes_option.php du site mutualise
  35. if (is_readable($f = $path . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php'))
  36.         include($f);
  37.  
  38. // demarrage du site
  39. spip_initialisation(
  40.         ($path . _NOM_PERMANENTS_INACCESSIBLES),
  41.         ($path . _NOM_PERMANENTS_ACCESSIBLES),
  42.         ($path . _NOM_TEMPORAIRES_INACCESSIBLES),
  43.         ($path . _NOM_TEMPORAIRES_ACCESSIBLES)
  44. );
  45. ?>

Préfixe des tables

Les exemples présentés nécessitent autant de bases de données que de sites mutualisés. Cependant, il est possible d’installer tous les sites dans une même base de données, en préfixant les noms de leurs tables d’un préfixe unique.

L’exemple ci-dessous crée un préfixe de 8 caractères : un préfixe avec les 4 premières lettres du site, suivi de 4 autres caractères.

  1. $table_prefix = substr(str_replace('.', '_', $site),0,4) . substr(md5($site),0,4);

Fichier config/mes_options.php

Toute modification du fichier config/mes_options.php du noyau SPIP affectera les options de tous les sites hébergés.

Par exemple, mettre dans ce fichier : $type_urls = ’propres’ ;

donnera par défaut à tous les sites ce type d’URL... Mais chaque site peut le changer dans son propre /sites/repertoire_du_site/config/mes_options.php.

Configurer Apache pour les domaines et sous-domaines

La mutualisation côté serveur, pour ce qui concerne la gestion des sous-domaines ou des domaines reste simple. Il suffit de créer une redirection entre le nom de domaine et le répertoire physique où est stocké SPIP.

Voici un exemple de configuration (minimale) pour un serveur nommé ’exemple.tld’ utilisant des sous-domaines. Le fichier de configuration est à créer dans /etc/apache2/sites_availables/exemple.tld, qu’il faut ensuite activer

SPIP est installé dans cet exemple dans ’/var/www/spip/’.

Si vous voulez en plus avoir des fichiers d’accès différenciés, il suffit d’utiliser la directive AccessFileName à l’intérieur de la directive VirtualHost, de sorte que le fichier d’accès du site S se nomme par exemple .htaccess-S.

Note sur les sauvegardes et les restaurations

Chaque site copie par défaut ses fichiers de sauvegardes dans le répertoire /sites/premier_site/tmp/dump (ou /sites/premier_site/tmp/upload/login pour les sauvegardes d’un administrateur restreint).

Les restaurations se font par le même dossier. Le chemin des images est aussi correctement pris en compte [3].

Notes

[1Les évolutions de SPIP 1.9.1 simplifiaient un peu la procédure, mais la mise en place vraiment fiable d’un partage du noyau de SPIP est arrivé avec les améliorations de SPIP 1.9.2 (nouvelle distribution des répertoires pour clarifier la mutualisation, correction des conflits de noms de logins et de sites, fonction d’initialisation d’un site à mutualiser clés en main). Avec spip2 les adresses de documents dans les sauvegardes XML deviennent indépendants de leur chemin physique, corrigeant ainsi le dernier blocage pour une utilisation d’envergure (les restaurations peuvent se réaliser d’un SPIP à l’autre comme s’il n’était pas mutualisé).

[2Avant SPIP 1.9.2, ces quatre types de données n’étaient pas clairement distingués et se retrouvaient dans les répertoires IMG, CACHE, ecrire et ecrire/data

[3Avant SPIP 2, SPIP enregistrait dans la base de données le chemin complet des images, pour ce qui concerne le dossier /IMG des sites mutualisés une adresse sites/premier_site/IMG/jpg/fichier.jpg à la place de IMG/jpg/fichier.jpg comme pour un site SPIP seul.

Une restauration fonctionnait correctement uniquement dans le site qui a créé la sauvegarde. Une astuce pour restaurer le site ailleurs consistait à éditer le fichier dump.xml et à remplacer toutes les occurrences (à l’exception de celles des déclarations dir_img et dir_logo dans l’ouverture de la balise spip) :
-  sites/premier_site/IMG/

  • par (SPIP seul) : IMG/
  • ou (SPIP mutualisé) : sites/mon_nouveau_site/IMG/

Inversement, pour passer un SPIP seul dans un répertoire mutualisé, il fallait remplacer toutes les occurrences de :
-  IMG/
-  par : sites/mon_site/IMG/


Voir le squelette de cette page Site réalisé avec SPIP | Espace de traduction | Espace privé