Compartició: un SPIP per diversos llocs

Procediment per compartir el nucli d’SPIP entre diversos llocs.

Compartir els fitxers d’SPIP entre diversos llocs, el que s’anomena una compartició, permet un estalvi d’espai de disc important, però també una possibilitat d’actualitzar SPIP de manera simple en el conjunt dels llocs actualitzant només el nucli.

SPIP permet compartir els seus fitxers a partir d’SPIP 1.9. Al llarg de les versions els procediments es clarifiquen i esdevenen més sòlids [1].

El concepte...

A partir d’SPIP 1.9.2 les carpetes necessàries pel funcionament del nucli SPIP (ecrire, prive, dist (convertits en squelettes-dist a la versió 2.0)), i aquells que marquen l’activitat d’un lloc (config, IMG, tmp, local) són clarament identificables i separats [2]. És aquesta separació la que permet tenir diversos llocs SPIP autònoms en un mateix nucli d’SPIP.

Aquesta autonomia reposa damunt de quatre directoris per lloc en els quals SPIP escriurà les dades que resultin de l’activitat del lloc. D’una banda, distingeix les dades temporals i les permanents, i, per l’altra, les dades accessible per HTTP de les que no ho són. Els dos directoris inaccessibles per HTTP es protegiran amb un .htaccess instal·lat automàticament per SPIP (els administradors del servidor poder posar aquests directoris a fora de l’arborescència servida per HTTP).

Aquests quatre directoris són diferents i nomenats per les següents constants PHP:

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

En una instal·lació simple d’SPIP, aquests directoris es creen a l’arrel del lloc amb els valors per defecte de més amunt. La compartició dels recursos d’SPIP reposa damunt de l’associació de quatre directoris específics a cada lloc, deduïts dels seus URL.

Inicialització de la compartició

Aquesta associació s’efectua per una funció, spip_initialisation. Admet quatre arguments que indiquen la localització dels quatre directoris fonamentals, i construeix a partir d’aquests les constants que serveixen al funcionament d’SPIP. En una instal·lació simple, aquests quatre arguments són les quatre constants de més amunt. La funció spip_initialisation és cridada just després de la càrrega de mes_options.php, i refusa silenciosament d’executar-se si ja ha estat cridada. Conseqüentment, si a dins d’aquest fitxer aquesta funció és aplicada sobre diferents arguments deduïts de l’URL del lloc, tindrem tants usos de fonts d’SPIP com URL’s del lloc. També podem definir en aquest fitxer les constants que serveixen al funcionament d’SPIP, tenint prioritat aquestes definicions sobre les que provarà de definir spip_initialisation.

El codi que hi ha més avall, situat en el fitxer config/mes_options.php agafa el nom de domini i executa una compartició sobre els quatre directoris tmp, local, config i IMG situats a dins de la carpeta sites/nom_du_domaine/. Abans, la definició d’algunes constants permet centralitzar els fitxers de centralització de tots els llocs en un únic directori, log, i no a sites/nom_du_domaine/tmp/ per a cadascun. Aquesta centralització no té res d’obligatòria però es revela útil; es pot aplicar també als directoris d’ajuda i de salvaguarda.

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

// ordre de cerca dels camins
define('_SPIP_PATH',
	$path . ':' .
	_DIR_RACINE .':' . 
	_DIR_RACINE .'squelettes-dist/:' .
	_DIR_RACINE .'prive/:' .
	_DIR_RESTREINT);

// afegit de la carpeta squelette
if (is_dir($path . 'squelettes'))
	$GLOBALS['dossier_squelettes'] = $rep . $site . '/squelettes';

// exemple de logs a l'arrel per tots els llocs
define('_FILE_LOG_SUFFIX', '_' . $site . '.log');
define('_DIR_LOG',  _DIR_RACINE . 'log/');

// prefixes de galetes i taules:
$cookie_prefix = str_replace('.', '_', $site); 
$table_prefix = 'spip';

// execució del fitxer config/mes_option.php del lloc compartit
if (is_readable($f = $path . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php')) 
	include($f); 

// inici del lloc
spip_initialisation(
	($path . _NOM_PERMANENTS_INACCESSIBLES),
	($path . _NOM_PERMANENTS_ACCESSIBLES),
	($path . _NOM_TEMPORAIRES_INACCESSIBLES),
	($path . _NOM_TEMPORAIRES_ACCESSIBLES)
);
?>

Compartir dominis i subdominis

Per compartir diversos dominis o subdominis, els heu de redirigir tots cap el directori físic que conté SPIP. Per exemple, http://example.org/, http://example.net/ i http://sous_domaine.example.net/. Per compartir-los cal que tots apuntin cap el mateix directori, com /var/www/spip/.

Aquesta carpeta conté, per tant, SPIP i també un fitxer config/mes_options.php per activar la compartició. Si reprenem l’exemple de codi donat més amunt, haurem de crear llavors les carpetes sites i log però també sites/example.org, sites/example.net i sites/sous_domaine.example.net i a dins de cadascun d’ells els directoris config, local, IMG i tmp accessibles a l’escriptura. No cal fer res més. Anant a un dels llocs, SPIP hauria de proposar-vos la seva instal·lació.

Si desitgeu poder activar tipus d’url diferents, com els «url arborescents» o els «url propis», necessitareu crear un fitxer d’accés Http, que es proporciona amb la distribució amb el nom de htaccess.txt: n’hi ha prou canviant-li el nom per .htaccess per posar-lo en marxa. S’aplicarà a tots els llocs compartits, però es possible tenir accessos diferenciats si configurem astutament el servidor (veure més avall). En tots dos casos, tot això només funcionarà si el vostre servidor accepta executar totes les directives presentades en aquest fitxer, sobretot les que fan referència a la reescriptura d’url («url rewriting»).

Compartir els directoris d’un domini

Cada carpeta (virtual) d’un domini, analitzant correctament l’URL, pot ser també un lloc SPIP compartit. Per això fa falta que l’URL de la carpeta estigui redirigida de manera transparent cap a l’arrel d’SPIP. És el paper del fitxer .htaccess modificat. D’aquesta manera http://example.com/premier_site/ i http://example.com/second_site/ poden ser cadascun llocs SPIP compartits (i http://example.com/ també).

En un primer temps, cal reanomenar el htaccess.txt com a .htaccess i modificar-lo per indicar que els directoris que són virtuals han d’apuntar a l’arrel d’SPIP. Per fer això, afegir a la part «Ajustos personalitzats» o bé el codi genèric que tracta tots els directoris virtuals (però http://example.com/premier_site sense / final enviarà un error), o bé un codi que indiqui els noms de carpetes (cap error si no hi ha cap / final):

// codi genèric
RewriteCond %{REQUEST_URI} !^/(config|ecrire|IMG|prive|plugins|plugins-dist|sites|squelettes-dist|squelettes|tmp|lib|local|mutualisation)/(.*)
RewriteRule ^[^/]+/(.*) /$1 [QSA,L]

// O codi específic
RewriteRule ^(premier_site|second_site)$ /$1/ [R,L]
RewriteRule ^(premier_site|second_site)/(.*) /$2 [QSA,L]

En un segon temps, cal crear una compartició analitzant en el fitxer config/mes_options.php el url transmès. Aquí un exemple per tenir els llocs compartits a sites/exemple.com, sites/premier_site i sites/second_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 . '/';

// ordre de cerca dels camins
define('_SPIP_PATH',
	$path . ':' .
	_DIR_RACINE .':' . 
	_DIR_RACINE .'squelettes-dist/:' .


	_DIR_RACINE .'prive/:' .
	_DIR_RESTREINT);

// afegit de la carpeta squelette
if (is_dir($path . 'squelettes'))
	$GLOBALS['dossier_squelettes'] = $rep . $site . '/squelettes';

// prefixos de les galetes i les taules:
$cookie_prefix = str_replace('.', '_', $site); 
$table_prefix = 'spip';

// execució del fitxer config/mes_option.php del lloc compartit
if (is_readable($f = $path . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php')) 
	include($f); 

// inici del lloc
spip_initialisation(
	($path . _NOM_PERMANENTS_INACCESSIBLES),
	($path . _NOM_PERMANENTS_ACCESSIBLES),
	($path . _NOM_TEMPORAIRES_INACCESSIBLES),
	($path . _NOM_TEMPORAIRES_ACCESSIBLES)
);
?>

Prefix de les taules

Els exemples presentats necessiten tantes bases de dades com llocs compartits. No obstant, és possible instal·lar tots els llocs en una mateixa base de dades, prefixant els noms de les seves taules en un únic prefix.

El següent exemple crea un prefix de 8 caràcters: un prefix amb les 4 primeres lletres del lloc, seguit d’uns altres 4 caràcters.

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

Fitxer config/mes_options.php

Qualsevol modificació del fitxer config/mes_options.php del nucli SPIP afectarà les opcions de tots els llocs allotjats.

Per exemple, posar en aquest fitxer: $type_urls = ’propres’ ;

farà que, per defecte, tots els llocs tinguin aquest tipus d’URL... Però cada lloc pot canviar-ho dins el seu propi /sites/repertoire_du_site/config/mes_options.php.

Configurar Apache pels dominis i els subdominis

La compartició al cantó servidor, pel que fa referència a la gestió dels subdominis o dels dominis és simple. N’hi ha prou creant una redirecció entre el nom de domini i el directori físic on està emmagatzemat SPIP.

Heus aquí un exemple de configuració (mínim) per a un servidor anomenat ’exemple.tld’ utilitzant subdominis. El fitxer de configuració s’ha de crear a dins de /etc/apache2/sites_availables/exemple.tld, que cal activar a continuació

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

SPIP està instal·lat, en aquest exemple, a dins de ’/var/www/spip/’.

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

</VirtualHost>

Si voleu a més a més tenir fitxers d’accés diferenciats, en teniu prou utilitzant la directiva AccessFileName a l’interior de la directiva VirtualHost, de manera que el fitxer d’accés del lloc S s’anomeni, per exemple, .htaccess-S.

Nota sobre les salvaguardes i les restauracions

Cada lloc copia per defecte els seus fitxers de salvaguardes a dins del directori /sites/premier_site/tmp/dump (o /sites/premier_site/tmp/upload/login per les salvaguardes d’un administrador restringit).

Les restauracions es fan per mitjà de la mateixa carpeta. El camí de les imatges també és té en compte correctament [3].

Notes

[1Les evolucions d’SPIP 1.9.1 simplificaven una mica el procediment, però l’execució veritablement fiable de compartir el nucli d’SPIP va arribar amb les millores d’SPIP 1.9.2 (nova distribució de directoris per clarificar la compartició, correcció dels conflictes dels noms de logins i de llocs, funció d’inicialització d’un lloc a compartir "claus en mà"). Amb spip2 les adreces de documents a les salvaguardes XML esdevenen independents del seu camí físic, corregint d’aquesta manera l’últim bloqueig per una utilització d’envergadura (les restauracions es poden realitzar d’un SPIP a un altre com si no estiguessin compartits).

[2Abans d’SPIP 1.9.2, aquest quatre tipus de dades no es distingien clarament i es trobaven en el directoris IMG, CACHE, ecrire i ecrire/data

[3Abans d’SPIP 2, SPIP enregistrava a dins de la base de dades el camí de les imatges, pel que fa a la carpeta /IMG dels llocs compartits una adreça sites/premier_site/IMG/jpg/fichier.jpg en lloc de IMG/jpg/fichier.jpg com per un lloc SPIP sol.

Una restauració només funcionarà correctament només a l’indret que ha creat la còpia de seguretat. El truc per a la restauració d’un lloc en un altre lloc consistia en editar manualment el fitxer dump.xml i substituir totes les aparicions (excepte les de dir_img i dir_logo a l’obertura de l’etiqueta spip):
-  sites/premier_site/IMG/

  • per (SPIP sol): IMG/
  • o (SPIP compartit): sites/mon_nouveau_site/IMG/

Inversament, per passar un SPIP sol a dins d’un directori compartit, fa falta substituir totes les ocurrències de:
-  IMG/
-  per: sites/mon_site/IMG/

Autor merce Publié le : Mis à jour : 02/07/23

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