SPIP çekirdeğinin ortak kullanımı

SPIP çekirdeğini birçok site arasında ortak kullanma prosedürü

SPIP çekirdeğinin ortak kulanımı SPIP 1.9’dan itibaren mümkündür. Amaç bir çok SPIP sitesini, tek bir SPIP çekirdeği kullanark tek bir hizmet birimi veya barındırma firması üzerinden idare etmektir.

Bu, önemli derecede disk alanı kazanmamızı sağlar, aynı zamanda çok basit bir güncelleme olanağı tanır çünkü sadece çekirdğei güncellemek yeterli olacaktır.

SPIP 1.9.1 daki gelişmeler prosedürü biraz kolaylaştırdı ama SPIP1.9.2 ve getirdiği geliştirmeler [1] ortak kullanımı çok daha sağlam hale getirdi cve SPIP çekirdeğinin paylaşılmasına olanak tanıdı.

Bu makale SPIP1.9.2 için Apache hizmet birimlerine kurulumunu açıklamaktadır [2] ve url’lerin yeniden yazılmasına izin vermektedir. (url_rewriting).

Aynı sonuca götüren birçok yöntem vardır : önemli olan ortak kullanımın bir hizmet biriminden mi yoksa bir barındırma firmasından mı yapılacağına karar vermektir.

Kavram ...

SPIP1.9.2’ten itibaren SPIP çekirdeğinin işletilmesi için gerekli dizinler (ecrire, squelettes-dist, oo) ve bir sitenin etkinliğini gösterenler (config, IMG, tmp, local) tamamen ayrılmış ve belirlenebilirdir. Bu ayrılmışlık, tek bir SPIP çekirdeği etrafında bir çok otonom SPIP sitesini olanaklı kılar.

Bu otonomluk site başına 4 dizin olmasına bağlıdır. Spip bunlara site etkinliklerini yazar. Bu dizinler 4 tanedir çünkü bir yandan kalıcı ve geçici veriler, diğer yandan http ile erişilebilen veya erişilemeyen veriler vardır : yani 4 tip veri. Http ile erişilemeyen 2 dizin SPIP tarafından otomatik olarak kurulan bir .htaccess ile korunur (hizmet birimi idarecileri bu dizinleri http tarafından hizmet verilen ağaç yapısının dışına da yerleştirebilirler).

SPIP 1.9.2’den önce, bu 4 veri tipi tam olarak ayrılmış değildi ve IMG, CACHE, ecrire ve ecrire/data dizinlerinde bulunuyorlardı. SPIP 1.9.2 ile, bu 4 dizin tamamen ayrılmıştır ve şu PHP sabitleriyle adlandırılmıştır :

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

Ortak kullanıma açık olmayan bir SPIP kurulumunda bu dizinler spip_initialisation fonksiyonunun uygulanması esnasında yukarıdaki 4 değer sayesinde sitenin kök dizininde oluşturulur. SPIP kaynaklarının ortak kullanımını sağlamak için spip_initialisation fonksiyonunu URL’den elde edilen 4 değişik değer üzerinden özel bir URL’yi özel dizinler dörtlüsüne bağlamak yeterlidir.

Doğru dizinleri oluşturmak

Ortak kullanımı başlatmak için önce işlevsel bir siteden yola çıkmak gerekir. Örnekler için, http://ornek.org/ url’si ile çağrılan ve fiziksel olarak /home/deneme/public_html/ dizininde yer alan bir siteden yola çıkacağız.

Dağıtımın kök dizininde (/ecrire ile aynı seviyede) ortak kullanılan sitelerin dizinlerini içeren bir dizin oluşturmak gerekir (örneğin ’siteler’).

-  dizinin ortak kullanımı :
http://ornek.org/ilk_site/ ve http://ornek.org/ikinci_site/ adreslerinin her birinin bir spip sitesini çağırmaları isteniyorsa, /siteler dizininin altında şu alt-dizinlerin oluşturulması gerekir : /ilk_site ve /ikinci_site; sonra bunların içinde /config, /IMG, /tmp, /local dizinlerinin oluşturulması gerekir. Bu 4 dizin yazma izinli olacak biçimde erişilebilir olmalıdır. Devamında bu dizinlere /squelettes dizini de eklenecektir.

-  alt-domaine ve domaine’in ortak kullanımı (bazı fikirler) :
http://deneme.ornek.org/, http://ornek.tld/ ve http://kullanici.ornek.com/ adreslerinden her birinin bir spip sitesi çağırması için /siteler dizininde /deneme, /ornek.tld ve /ornek.com/kullanici dizinlerinin oluşturulması gerekir.

Uyarı : Tüm bağlantılar kök dizini işaret etmelidir yani /home/deneme/public_html/. Bu, ya .htaccess dosyasının ya da ileride açıklayacağımız Apache hizmet birimi yapılandırmasının gerçekleştireceği bir görevdir.

Doğru düzenlenmiş yönlendirmeler !

SPIP’in bir sitenin ortak kullanıma açık olduğunu anlaması için (index.php tarafından çağrılan) spip.php skriptinin çalıştırılması gerekir. Bu skript /config/mes_options.php’ye eklenen bir kod sayesinde çağrılan URL’nin ortak kullanıma açık bir siteye karşı düşüp düşmediğine bakacaktır. Bunun için, http://ornek.org/ilk_site/ veya http://ornek.org/ikinci_site/ adresinin http://ornek.org/ adresine yönlendirilmesi ve index.php’yi çalıştırması gerekir...

Bu, .htaccess dosyasının görevidir (veya direkt olarak Apache hizmet biriminin yapılandırmasının)

htaccess.txt dosyasını dağıtımın kök dizinine kopyalamalı ve ismini .htaccess olarak değiştirmeli, sonra da şu değişiklikleri yapmalıdır :

URL’nin yeniden yazılmasına izin vermek için (normalde hiçbir şey değişmez) : RewriteEngine On

Eğer SPIP dağıtımı bir alt-dizindeyse rewritebase değiştirilmelidir. Burada, site kök dizinde, yani : RewriteBase /

Son olarak, kişisel ayarlarda, şu kod eklenmelidir ki /premier_site , /ikinci_site ve /üçüncü_site dizinleri dağıtımın kök dizininden işlenebilsin :

#Mutualisation
RewriteRule ^(ilk_site|ikinci_site|üçüncü_site)$ /$1/ [R,L]
RewriteRule ^(ilk_site|ikinci_site|üçüncü_site)/(.*) /$2 [QSA,L]

İlk rewriterule http://ornek.org/ilk_site adreslerini http://ornek.org/ilk_site{{/e yönlendirir. İkinci, /ilk_site/ ’nin ardındakileri kök dizine, örneğin: http://ornek.org/ilk_site/article112 http://ornek.org/article112 adresine yönlendirilir. (Bu arada, bu yönlendirme şeffaftır, url’nin ismi değişmez. daima http://ornek.org/ilk_site/article112’dir. Özellikle php’de ve php için !)

Peki ya SPIP bir alt-dizinde bulunuyorsa ?
Bu durumda, spip dosyaları /home/deneme/public_html/spip/ dizinindedir, SPIP http://ornek.org/spip/ tarafından çağrılır, ortak kullanıma açık siteler http://ornek.org/spip/ilk_site/ veya http://ornek.org/spip/ikinci_site/ tarafından çağrılır.

O zaman .htaccess dosyasına şunu koymak gerekir :

RewriteEngine On
RewriteBase /spip/

#Ortak kullanım (Mutualisation) 
RewriteRule ^(ilk_site|ikinci_site|üçüncü_site)$ /spip/$1/ [R,L]
RewriteRule ^(ilk_site|ikinci_site|üçüncü_site)/(.*) /spip/$2 [QSA,L]

Peki ya tüm dizinleri ortak kullanılan siteler gibi yönlendirmek istersek ?

Yukarıda rewriterules yerine yerine ortak kullanıma açık sitedeki dizinin ismi ne olursa olsun işe yarayan bir jenerik kod kullanılabilir :

-  kök dizinde

RewriteCond %{REQUEST_URI} !^/(config|squelettes-dist|ecrire|IMG|oo|plugins|siteler|squelettes|tmp|local)/(.*)
RewriteRule ^[^/]+/(.*) /$1 [QSA,L]

-  veya bir /spip dizininde :

RewriteCond %{REQUEST_URI} !^/spip/(config|squelettes-dist|ecrire|IMG|oo|plugins|siteler|squelettes|tmp|local)/(.*)
RewriteRule ^[^/]+/(.*) /spip/$1 [QSA,L]

Domaine’ler ve alt-domaine’le için ?
Çok mutlu bir tesadüftür ki burada yapılacak hiçbir şey yok çünkü zaten SPIp dağıtımının kök dizinini işaret ediyorlar...

Mutualiser selon l’URL grâce à mes_options.php

İşin önemli kısmını halledecek olan kök dizindeki /config/mes_options.php dosyasıdır : bir URL’nin ortak kullanılıp kullanılmayacağını anlayıp SPIP’i buna göre başlatmak onun görevidir.

Dizinler ve domaine’ler arasında bir çok farklı durum olabilir. PHP skript’i çağıran URL’leri test etmek için 2 değişkenden yararlanabilir :

$_SERVER['REQUEST_URI']; // domaine isminin ardındaki her şeyi içerir  : örneğin /ilk_site/article112 ...
$_SERVER['SERVER_NAME']; // domaine ve alt-domaine ismini içerir : örneğin kullanici.ornek.org 

Ortak kullanıma açık dizinin ismini elde etmek için bakılacak değerlerş içeren bu 2 değişkendir.

Tüm dizinleri ortak kullanıma açacak basit bir yöntem aşağıdaki kodu kopyalamaktır :

<?php 
if ( preg_match(',/([a-zA-Z0-9_-]+)/?,',$_SERVER['REQUEST_URI'],$r)) {

    if (is_dir($e = _DIR_RACINE . 'siteler/' . $r[1]. '/')) {

        $cookie_prefix = $table_prefix = $r[1]; 

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

        spip_initialisation(
            ($e . _NOM_PERMANENTS_INACCESSIBLES),
            ($e . _NOM_PERMANENTS_ACCESSIBLES),
            ($e . _NOM_TEMPORAIRES_INACCESSIBLES),
            ($e . _NOM_TEMPORAIRES_ACCESSIBLES)
            );

       $GLOBALS['dossier_squelettes'] = $e.'squelettes';

        if (is_readable($f = $e._NOM_PERMANENTS_INACCESSIBLES._NOM_CONFIG.'.php')) include($f);
    }
} 
?>

preg_match satırı URL’nin ağaç yapısındaki dizin ismini alır, örneğin http://ornek.org/ilk_site/ ’deki ’ilk_site ... Sonra eğer /siteler/ilk_site/ mevcutsa skript ortak kullanımı dener.

Eğer SPIPbir /spip dizininin altındaysa ilk satırı şöyle değiştirmek gerekir : if (preg_match(',/spip/([a-zA-Z0-9_-]+)/?,', $_SERVER['REQUEST_URI'], $r)) {

SPIP’e kullanılan veritabanının ön-ekinin bildirilmesi gerekir : bunu da şu kod gerçekleştirir $cookie_prefix = $table_prefix = $r[1];
Bu satır, siteyi içeren dizinin ismini taşıyan ön-eklerle MySQL tablolarını oluşturur : örneğin spip_article yerine benim_sitem_article. Bu yöntem bize tek ve aynı veritabanı üzerinde bütün siteleri barındırma olanağı tanır. Varsayılan (spip) ön-ekini koruyabilirsiniz ama her site için ayrı veritabanları öngörmelisiniz.
Bunun için, şu kodu ekleyebilirsiniz :

$cookie_prefix = $r[1]; 
$table_prefix='spip';

spip_initialisation fonksiyonu, ortak kullanıma açılan sitenin çalışması için gerekli dizinlerin adresleri olan 4 parametreye gereksinim duyar.

$GLOBALS['dossier_squelettes'] = $e.'squelettes'; ortak kullanıma açılan sitenin iskelet dizinini tanımlar.

En sonunda da son satırlar şöyle bir dosyayı yükler : siteler/ilk_site/config/mes_options.php.

Bilgi :

SPIP çekirdeğinin config/mes_options.php dosyasında yapılan her değişiklik barındırılan tüm siteleri etkileyecektir.

Örneğin, bu dosyayı eklerseniz : $type_urls = ’propres’ ;

Bu url tipindeki tüm siterleri etkiler... Ama her site bunu kendi dosyasında değiştirebilir /siteler/benim_sitem/config/mes_options.php.

Apache’ı domaine’ler ve alt-domaine’ler için yapılandırmak

Hizmet birimi tarafında, domaine’leri veya alt-domaine’leri ilgilendiren ortak kullanımın işletimi çok basittir ama bu sitelerin dikkate alınması için Apache hizmet biriminin yapılandırmasında bazı yönlendirmeler gerektirir.

İşte size ’ornek.tld’ isimli ve alt-dizinler kullanan bir hizmet birimi için bir yapılandırma örneği (burada SPIP ortak kullanıma açıktır ve http://kullanici.ornek.org/spip/ tarafından çağrılır) .

SPIP çekirdeği ’/home/deneme/public_html/spip/’ dizinindedir.

O zaman şu iki dizin oluşturulmalıdır : /siteler/ornek.tld/ , /siteler/ornek.tld/kullanici/.

Yapılandırma dosyası /etc/apache2/sites_availables/default altında Apache 2/linux ’tadır. (siz sites_availables dizininde yeni bir dosya oluşturup onu etkinleştirebilirsiniz).

# SERVEUR exemple.tld
# SPIP par sous domaine...
<VirtualHost *>
        ServerName exemple.tld
	ServerAlias *.exemple.tld

        # SPIP çekirdeğine yönlendirme
	DocumentRoot "/home/deneme/public_html"
	<Directory "/home/deneme/public_html/">
		AllowOverride All
		Order allow,deny
		Allow from all
	</Directory>

	# Sadece http://kullanici.ornek.tld/spip/* adresi yönlendirilmelidir

	# (kullanici.ornek.tld/spip/* -> /home/deneme/public_html/*)
	RewriteCond %{SERVER_NAME} (www\.)?([^.]+)\.ornek\.net$
	RewriteRule ^/spip/(.*) /home/deneme/public_html/spip/$1 [QSA,L]

	# (kullanici.ornek.tld/* -> /home/deneme/public_html/siteler/ornek.tld/kullanici/*)
	RewriteCond %{SERVER_NAME} (www\.)?([^.]+)\.ornek\.net$
	RewriteRule (.*) /home/deneme/public_html/siteler/ornek.tld/%1/$1 [QSA,L]

</VirtualHost>

/config/mes_options.php adresinde bu ortak kullanımları test etmek zorunludur :

<?php
# pour kullanici.ornek.tld/spip/ için 
if ( preg_match(',(.*)\.exemple\.tld/spip/?,',$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'],$r)) {

    if (is_dir($e = _DIR_RACINE . 'siteler/ornek.tld/' . $r[1]. '/')) {

       $cookie_prefix = $table_prefix = $r[1]; 

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

        spip_initialisation(
            ($e . _NOM_PERMANENTS_INACCESSIBLES),
            ($e . _NOM_PERMANENTS_ACCESSIBLES),
            ($e . _NOM_TEMPORAIRES_INACCESSIBLES),
            ($e . _NOM_TEMPORAIRES_ACCESSIBLES)
            );

       $GLOBALS['dossier_squelettes'] = $e.'squelettes';

        if (is_readable($f = $e._NOM_PERMANENTS_INACCESSIBLES._NOM_CONFIG.'.php')) include($f);
    }
} 
?>

Yedeklemeler ve geri yüklemeler üzerine notlar

Her site, kısıtlı bir yönetici için yedekleme dosyalarını /siteler/ilk_site/tmp/dump (veya /siteler/ilk_site/tmp/upload/login dizinine kopyalar). Geri yüklemeler de aynı dizin kullanılarak yapılır.

Dikkat:

Şu anda SPIP, /IMG dizini ile ilgili olarak, veritabanına tek başına sitelerde kullandığı IMG/* yerine ortak kullanıma açık siteler için siteler/ilk_site/IMG/* bilgisini kaydeder.

Geri yükleme ancak yedeklemeyi yapan siteden çağrıldığında çalışacaktır.

Yedeklemeyi başka bir yere geri yüklemek ancak dump.xml dosyasını düzenleyerek ve bu değerin geçtiği her yeri değiştirerek mümkündür (dir_img ve dir_logo deklarasyonları isitisnadır. ) :
-  siteler/ilk_sitem/IMG/

  • (tek başına SPIP) ile : IMG/
  • veya (ortak kullanılan SPIP) : siteler/benim_yeni_sitem/IMG/

Tersine, ortak kullanılan bir dizinde tek başına bir SPIP yüklemek için tüm “IMG/” lerin “siteler/bemim_sitem/IMG/” olarak değiştirilmesi gerekir.

Notlar

[1Ortak kullanımı netleştirmek için yeni bir dizin dağıtım biçimi, login sorunlarının ve ayrık site isimlerinin ortak kullanılanlarla karışması gibi sorunların çözülmesi, ortak kullanılacak bir sitenin kurulum işleminin daha net olması

[2Bilgi için : bu prosedürler Apache 2.0.55 ve PHP 5.1.2 ile Ubuntu Dapper Drake hizmet birimi ve PHP 5.1.6 ile Ubuntu Edgy Eft sistemlerinde test edilmiştir

Yazar : mega Publié le : Mis à jour : 26/10/12

Traductions : عربي, català, English, Español, français, italiano, Türkçe