Eén SPIP systeem voor meerdere sites

De procedure voor het gemeenschappelijk gebruik van de core van SPIP.

Het delen van de bestanden van SPIP tussen meerdere sites bespaart ruimte op de server en vereenvoudigt het onderhoud.

SPIP maakt het mogelijk zijn core functionaliteit te delen. Tijdens de ontwikkeling van het systeem werd deze functionaliteit geleidelijk verbeterd [1].

Het concept

Alle mappen met bestanden die benodigd zijn voor het functioneren van de core van SPIP (zoals ecrire, prive, squelettes-dist) en degene die de activiteit van een site bevatten (config, IMG, tmp, local) zijn gescheiden en definieerbaar. Door deze scheiding kunnen meerdere SPIP sites op dezelfde broncode werken.

Deze autonomie berust op vier mappen per site waarin SPIP de activiteiten van die respectievelijke sites zal wegschrijven. Er wordt daarbij onderscheid gemaakt tussen tijdelijke en permanente gegevens aan een kant en de via HTTP bereikbare gegevens aan de andere kant. De twee mappen die niet via HTTP benaderd kunnen worden, zijn beveiligd met een .htaccess die SPIP automatisch plaatst (de beheerders van de server mogen deze mappen ook buiten de door HTTP benaderbare structuur plaatsen).

De namen van deze vier mappen worden bepaald door de volgende PHP constanten:

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

In een eenvoudige SPIP installatie staan deze mappen in de root van de site en hebben ze hun standaardwaardes, zoals hierboven aangegeven. Wanneer er sprake is van een gedeeld gebruik van SPIP gebeurt de associatie van deze vier mappen aan de hand van hun respectievelijke URL’s.

Initialisatie

Deze associatie wordt uitgevoerd door de functie spip_initialisation. Ze heeft vier argumenten die de plaats van de vier mappen aangeven en bouwt hiermee de constanten op die benodigd zijn voor een juiste werking van SPIP. In een eenvoudige installatie zijn dat de vier bovenvermelde argumenten. De functie spip_initialisation wordt opgeroepen direct na het laden van het bestand mes_options.php en kan slechts éénmaal worden uitgevoerd. Dienovereenkomstig zal indien deze functie in dit bestand op verschillende argumenten wordt toegepast die zijn afgeleid van de URL van de site, zullen we zoveel sites op dezelfde broncode van SPIP laten werken als dat we site URL’s hebben. In hetzelfde bestand kunnen we ook constanten definiëren voor de werking van SPIP. Deze definities hebben voorrang op die welke standaard worden gebruikt in spip_initialisation.

Plaats je onderstaande code in het bestand config/mes_options.php, dan wordt de domeinnaam gebruikt om een gemeenschappelijke toepassing mogelijk te maken. Hun mappen tmp, local, config en IMG worden ondergebracht in de map sites/domeinnaam/. Desondanks kunnen we aangeven dat de logbestanden van alle sites op één gemeenschappelijk plaats worden opgeslagen, namelijk in de map log, en niet in elke sites/domeinnaam/tmp/. Deze centralisatie is niet verplicht, maar kan voor bepaalde gegevens zinvol zijn (zoals voor de hulpfuncties en voor de plaats van de backup bestanden.

<?php
$rep = 'sites/';
$site = $_SERVER['HTTP_HOST'];
$path = _DIR_RACINE . $rep . $site . '/';

// volgorde zoekpad
define('_SPIP_PATH',
	$path . ':' .
	_DIR_RACINE .':' . 
	_DIR_RACINE .'squelettes-dist/:' .
	_DIR_RACINE .'prive/:' .
	_DIR_RESTREINT);

// de map met skeletten
if (is_dir($path . 'squelettes'))
	$GLOBALS['dossier_squelettes'] = $rep . $site . '/squelettes';

// voorbeeld van logbestanden op een gemeenschappelijke plaats
define('_FILE_LOG_SUFFIX', '_' . $site . '.log');
define('_DIR_LOG',  _DIR_RACINE . 'log/');

// prefix voor cookies en tabellen:
$cookie_prefix = str_replace('.', '_', $site); 
$table_prefix = 'spip';

// uitvoering van het bestand config/mes_option.php voor sites met gedeeld gebruik
if (is_readable($f = $path . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php')) 
	include($f); 

// starten van de site
spip_initialisation(
	($path . _NOM_PERMANENTS_INACCESSIBLES),
	($path . _NOM_PERMANENTS_ACCESSIBLES),
	($path . _NOM_TEMPORAIRES_INACCESSIBLES),
	($path . _NOM_TEMPORAIRES_ACCESSIBLES)
);
?>

Gedeeld gebruik bij domeinen of subdomeinen

Om bij verschillende domeinen of subdomeinen een gedeeld gebruik van SPIP toe te passen, ga je ze allemaal verwijzen naar de map waarin SPIP zich daadwerkelijk bevindt. Om bijvoorbeeld deze URL te gebruiken: http://mijnsite.org/, http://mijnsite.net/ en http://subdomein.mijnsite.net/, laat je ze allemaal verwijzen naar dezelfde map, zoals /var/www/spip/.

Deze map bevat dus zowel SPIP als een bestand config/mes_options.php dat het gedeelde gebruik gaat regelen. Wanneer we de structuur uit het vorige voorbeeld gebruiken, maken we dus de mappen sites en log alsmede sites/mijnsite.org, sites/mijnsite.net en sites/subdomein.mijnsite.net met in ieder de mappen config, local, IMG en tmp, allemaal schrijfbaar. Verder hoef je niets aan te maken. Door met je browser naar één van de sites te gaan, zal SPIP je voorstellen een installatie te doen.

Wil je in SPIP gebruik maken van een ander type URL, dan zul je hiervoor een .htacces-bestand moeten maken. Deze zal op alle gedeelde sites van toepassing zijn, maar je kunt dat ook veranderen met een specifieke configuratie van je server (daarover verderop meer). Besef wel dat dit allemaal uitsluitend zal werken als jouw provider «url rewriting» toestaat.

De mappen van een domein gedeeld gebruiken

Elke virtuele map van een domein kan ook een gedeelde SPIP site worden. Je moet er daarbij voor zorgen dat de URL van die map op een transparante manier wordt doorverwezen naar de root van SPIP. Het is de rol van het aangepaste .htaccess bestand. Zo kunnen http://mijnsite.com/eerste_site/ en http://mijnsite.com/tweede_site/ gedeelde SPIP sites zijn (en http://mijnsite.com/ ook).

Om te beginnen moet je het meegeleverde bestand htaccess.txt hernoemen in .htaccess en het zodanig aan te passen dat de virtuele mappen moeten verwijzen naar de root van SPIP. Pas daarvoor in het gedeelte «Réglages personnalisés» ofwel de generieke code die alle virtuele mappen verwerkt (maar http://mijnsite.com/eerste_site zal zonder afsluitende / een foutboodschap geven), ofwel een code die de namen van de mappen vermeldt (geen foutboodschap zonder afsluitende /):

// code générique
RewriteCond %{REQUEST_URI} !^/(config|ecrire|IMG|prive|plugins|plugins-dist|sites|squelettes-dist|squelettes|tmp|lib|local|mutualisation)/(.*)
RewriteRule ^[^/]+/(.*) /$1 [QSA,L]

// OF de specifieke code
RewriteRule ^(eerste_site|tweede_site)$ /$1/ [R,L]
RewriteRule ^(eerste_site|tweede_site)/(.*) /$2 [QSA,L]

In een tweede stap moet in het bestand config/mes_options.php worden gekeken met welke URL de site werd benaderd. Dit is een voorbeeld waarbij de structuur van de mappen als volgt is: sites/mijnsite.com, sites/eerste_site en sites/tweede_site:

<?php
if ( 
	(
		preg_match(',^/([\.a-zA-Z0-9_-]+)/,', $_SERVER['REQUEST_URI'], $r)
		AND !is_dir(_DIR_RACINE . $r[1])
	)
) {
	$site = $r[1];
} else {
	$site = $_SERVER['HTTP_HOST'];
}

$rep = 'sites/';
$path = _DIR_RACINE . $rep . $site . '/';

// zoekvolgorde
define('_SPIP_PATH',
	$path . ':' .
	_DIR_RACINE .':' . 
	_DIR_RACINE .'squelettes-dist/:' .


	_DIR_RACINE .'prive/:' .
	_DIR_RESTREINT);

// toevoeging van een map squelettes
if (is_dir($path . 'squelettes'))
	$GLOBALS['dossier_squelettes'] = $rep . $site . '/squelettes';

// prefix voor cookies en tabellen:
$cookie_prefix = str_replace('.', '_', $site); 
$table_prefix = 'spip';

// uitvoering van bestand config/mes_option.php voor de gedeelde site
if (is_readable($f = $path . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php')) 
	include($f); 

// starten van de site
spip_initialisation(
	($path . _NOM_PERMANENTS_INACCESSIBLES),
	($path . _NOM_PERMANENTS_ACCESSIBLES),
	($path . _NOM_TEMPORAIRES_INACCESSIBLES),
	($path . _NOM_TEMPORAIRES_ACCESSIBLES)
);
?>

Prefix van tabellen

De gepresenteerde voorbeelden hebben zo veel databases nodig als er gedeelde sites zijn. Het is echter mogelijk om alle sites in dezelfde database te installeren, door voor de namen van hun tabellen een uniek voorvoegsel te plaatsen.

Het onderstaande voorbeeld maakt een prefix van 8 tekens bestaande uit de eerste 4 letters van de site, gevolgd door 4 andere tekens.

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

Bestand config/mes_options.php

Elke aanpassing in het bestand config/mes_options.php van de core van SPIP werkt door in de gedeelde sites.

Zetten we bijvoorbeeld in dit bestand: $type_urls = ’propres’ ;

dan krijgen alle sites dit type URL... Maar je kunt ook iedere site zijn eigen /sites/repertoire_du_site/config/mes_options.php geven!

Apache configureren voor domeinen en subdomeinen

Het gedeeld gebruik van SPIP is aan de serverzijde relatief simpel voor wat betreft het gebruik van domeinen of subdomeinen. Je hoeft alleen een doorverwijzing te maken tussen het domein en de fysieke plaats van SPIP.

Dit is een (minimaal) configuratievoorbeeld voor een server genaamd ’voorbeeld.tld’ die subdomeinen gebruikt. Het configuratiebestand moet worden gemaakt in /etc/apache2/sites_availables/voorbeeld.tld, wat vervolgens moet activeren

sudo a2ensite voorbeeld.tld
sudo /etc/init.d/apache2 reload

In dit voorbeeld is SPIP geïnstalleerd in ’/var/www/spip/’.

<VirtualHost *>
	ServerName voorbeeld.tld
	ServerAdmin webmaster@localhost
	ServerAlias *.voorbeeld.tld
	
	DocumentRoot /var/www/spip/
	<Directory /var/www/spip/>
		Options Indexes FollowSymLinks MultiViews
		AllowOverride All
		Order allow,deny
		allow from all
	</Directory>

</VirtualHost>

Wil je bovendien verschillende toegangsbestanden, dan volstaat het directive AccessFileName te gebruiken binnen de directive VirtualHost, waarbij het toegansgbestand van site S bijvoorbeeld .htaccess-S heet.

Opmerking over backup en restore

Iedere site plaatst zijn backupbestanden standaard in map/sites/eerste_site/tmp/dump (of /sites/eerste_site/tmp/upload/login voor een beheerder met beperkte toegangsrechten).

Het terugzetten moet dus vanuit diezelfde map gedaan worden. Voor afbeeldingen geldt hetzelfde als voor een individuele site.

Een restore werkt alleen goed als die op de site gebeurt vanwaar de backup werd gemaakt. Een tip om een restore op een andere plaats te kunnen doen is het aanpassen van het bestand dump.xml en daar overal (behalve bij de declaraties van dir_img en dir_logo bij de opening van de spip tag) aan te passen:
-  sites/eerste_site/IMG/

  • door (in een individuele site): IMG/
  • of (een gedeelde SPIP site): sites/mijn_nieuwe_site/IMG/

En het omgekeerde werkt natuurlijk ook!

Voetnoot

[1Zo werden in SPIP 2 de adressen van de documenten in een XML backup onafhankelijk van hun fysieke adres, wat een belangrijke verbetering opleverde.

Auteur Hanjo Gepubliceerd op: Aangepast: 02/07/23

Vertalingen: català, English, français, Nederlands