Több domain kiszolgálása egyetlen Drupal példánnyal (multi-site install)

Ebben a rövid kis HOGYANban szeretném felhívni a kedves olvasó figyelmét a Drupal egy igen izgalmas ámde kevéssé ismert tehetségére, a multi-site install-ra. Ez olyan Drupal installáció, amelyben egyetlen példányt tartunk naprakészen, de több domain-t is kiszolgálunk a segítségével, ráadásul úgy, hogy minden domainünk saját modulokkal, sminkekkel és beállításokkal rendelkezhet, anélkül hogy a többi oldallal interferálnának.

Lehetőség van külön adatbázisba installálni minden ilyen módon futtatott domain-t, ám azt is megtehetjük, hogy egy adatbázisba rakjuk minden domain tábláit és előtaggal, prefixxel látjuk el azokat.

Lássuk hogyan is kell egy ilyen installációt végigcsinálni:

Töltsünk le egy Drupal csomagot és tömörítsük ki végleges helyére. Ezt követően tegyük írhatóvá a sites/default/settings.php-t (Drupal 5), majd installáljuk szabályosan a Drupalunkat.

A következő lépésben hozzunk létre egy új könyvtárat a sites/ alatt az új domainünk nevével. Például:

sites/www.pelda.hu

Másoljuk be a default alatt levő settings.php-t ez alá a könyvtár alá:

sites/www.pelda.hu/settings.php

Módosítsuk a fileban a $db_prefix változót és adjunk meg egy egyedi tábla előtagot. Módosíthatjuk a $db_url-t is ha külön adatbázisba tesszük ennek domainnek tábláit. Ilyenkor nem feltétlen kell tábla prefixet megadnunk.

Ha ezzel végeztünk, látogassunk el a www.pelda.hu/install.php oldalra és installáljuk az új drupalunkat.

Kész is vagyunk, már csak az Apache-unkat kell beállítanunk hogy a www.pelda.hu-ra is a Drupal installációnk gyökerét keresse fel (FIGYELEM! Nem a sites/www.pelda.hu könyvtárat!). Arra azonban figyeljünk oda, hogy a pelda.hu-ra az eredeti oldalunk fog bejönni és nem a www.pelda.hu. Ha aldomaintől függetlenül akarjuk megvalósítani a sitejainkat, akkor hagyjuk el azt. Például ne www.pelda.hu-t adjunk könyvtárnévnek, hanem csak pelda.hu-t. Ilyenkor bármi.pelda.hu, így pl. a www.pelda.hu is ebből a konfigurációból fog kiszolgálódni, a Drupal ugyanis addig vagdossal le az aldomaineket, ameddig nem talál egy egyező könyvtárnevet vagy ha nem lel egyáltalán, akkor a sites/default-ban megadott adatokkal működő oldalt hívja be (ami praktikusan egy hibát jelző oldalt tartalmazhat).

A közös adatbázis lehetősége egy hasznos kis trükkre is lehetőséget ad. Lehetséges hogy azt szeretnénk, hogy a felhasználói adatok bizonyos domaineknél azonosak legyenek, ne kelljen minden domain alá regisztrálnia minden felhasználónak. Ilyen eset lehet ha a domainünk aldomainjeinek a cikkeit szeretnénk elválasztani (Például van egy wiki.example.com és egy forums.example.com aldomainünk is). Ehhez lehetőséget biztosít számunkra a Drupal.

A kulcsszó itt a settings.php-ban a $db_prefix változó. Ez a változó nem csak egy stringet tárolhat, hanem egy tömböt is. Benne a kulcsok a táblák nevei. A változók pedig a prefixek, amelyekkel a táblákat el akarjuk látni.

$db_prefix = array(<br /> 'default'&nbsp;&nbsp; =&gt; 'mysite_',<br /> 'users'&nbsp;&nbsp;&nbsp;&nbsp; =&gt; 'shared_',<br /> 'sessions'&nbsp; =&gt; 'shared_',<br /> 'role'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; 'shared_',<br /> 'authmap'&nbsp;&nbsp; =&gt; 'shared_',<br /> 'sequences' =&gt; 'shared_',<br /> 'profile_fields' =&gt; 'shared_',<br /> 'profile_values' =&gt; 'shared_',<br /> 'users_roles' =&gt; 'shared_',<br /> );

A default kulcs ebben a tömbben speciális jelentésű. Ez határozza meg ugyanis, hogy az itt fel nem sorolt tábláknak milyen prefixe legyen. Így tehát csak azokat a táblákat kell felsorolnunk a tömbben, amelyeket szeretnénk közösen használni domainek között. Ezen közösen használni kívánt táblák prefixét állítsuk be úgy hogy minden domain alatt ugyanaz legyen. Csak a default kulccsal jelölt elem értéke változzon domainről-domainre.

Ezt a $db_prefix tömböt meg kell adnunk minden multi domainünkre, hogy mindannyian tudjanak a közös táblákról.

Ha ezek után lefuttatjuk az install.php-t, akkor sok hibaüzenetet fogunk kapni sikertelen create table-ökről és insert-ekről. Ezektől ne rettenjünk meg, ez így van rendjén.

Új oldalunkon a régi oldalak egy felhasználójával máris be tudunk jelentkezni, nem is kell új felhasználót létrehoznunk.

Ha az szeretnénk, hogy az egyik ilyen users táblát és hasonlókat megosztó oldalunkon bejelentkezve a többi oldalba is automatikusan bejelentkeztessük a felhasználóinkat, akkor a Single Sign-On modul kell nekünk.

Végre egy értelmes leírás

Helo Tolmi
Végre egy értelmes leírás azoknak a nyelvén, akik még nem profik is érthetik.
Sajna amikor kezdtem még nem volt, és a segítség sem volt meg. De biztosan sokaknak lesz segítségére.
Látom a sok közöségi munkádat nagyszerű ember vagy, köszi mindenki nevében is.

üdv: Dzsozef

multi-site

Megoldhato az, hogy minden aldomain-ek kulon (al)adminisztratora is legyen, (persze nekem is). O tudja szerkeszteni az oldalt, link torlese/link hozzaadasa szin vallasztas forum/blog szerkesztese es semmi mas szerkesztesi joga ne legyen az oldalon. valami olyasmi mint a startlap.hu (lap.hu)

Attól függ

Ha a user táblán nem osztoznak a multi-site installok (tehát nincs közös felhasználói adatbázis), akkor igen. Egyébként nem, mert a Drupal mindíg az uid=1-et tekinti adminnak és nyilván ha a user tábla közös, akkor csak egy usernek lehet 1-es uid-ja.

köszönöm

köszönöm szépen a segítségeteket. Az apach és htaccess beállításokkal nagyjából már tisztában vagyok, most már a drupal oldaláról is jobban értem a dolgot.

www-s fődomain

szia

nagyon jó a leírás, de nem teljesen tudom alkalmazni, az általam elképzelt felépítéshez, ezért kérek tőled segítséget.
Azt szeretném megoldani, hogy a fődomain-em a http://www.tiborg.info legyen. Ez a www-s oldal jöjjön be akkor is, ha a www nélkül írják be, csupán http://tiborg.info Ezt htaccess-el vagy az apache beállítással vagy a drupal multi installal tudom megoldani? Ezen felül szeretnék http://hu.tiborg.info -t és még egyéb nyelvekűeket. (http://de.tiborg.info, stb...) Ebben a speciális helyzetben, hogyan érdemes a multi site installt elvégeznem?

Még azt szeretné megtudni a multisite installal kapcsolatban, hogy megoldható-e esetleg az, hogy a fődomain (www.tiborg.info -n) karbantartási üzenet jelenjen meg, tehet site offline, és csak a hu.tiborg.info működjön amig elkészülnek a fordítások.

köszönöm szépen a leírást és a segítséget.

üdv

tiborg

Biztos hogy multi-site kell neked?

Azért kérdezem mert ha csak annyit szeretnél elérni hogy külön aldomain alatt legyenek a különböző nyelvek, de ugyanazt a tartalmat, konfigurációt, egyebet akarod használni, akkor tök felesleges, sőt irtózatos plusz munkát fog jelenteni. Van egy jobb megoldás: i18n modul. Ebben be lehet azt is állítani hogy a nyelvi kódok aldomainjein jelenjen meg a site lefordított verziója. Így csak egy Drupal-t kell karbantartani és a fordítást is segíti a Drupal beépített fordításkezelője. Mi legalábbis így csinálunk többnyelvű rendszereket. (Megj.: Az aldomainek megfelelő átirányítása a drupal root-ra szükséges! Tehát minden aldomain és a fő domain ugyanoda, a Drupal index.php tartalmazó könyvtárára mutasson)

Ha pedig mégsem ez kell és multi-site mellett maradsz, akkor egyrészt hozz létre egy sites/tiborg.info -t, majd a sites/hu.tiborg.info-t, sites/de.tiborg.info-t ésatöbbi. Így a sites/tiborg.info egy un. catch-all domain lesz (erről írok a cikkben). Ha valaki pl. beírja hogy en.tiborg.info, akkor a Drupal be fogja tölteni a tiborg.info-t a sites/tiborg.info alól. Persze ez megkavarhatja a Google Botot, így a megoldást kiegészítheted azzal, hogy htaccess-ben megoldod Apache Rewrite szabályokkal, hogy tiborg.info domaint 301-el átirányítsa www.tiborg.info-ra.

Remélem ez segített.

Ez nagyrészt nem drupal

Amit szeretnél az nem Drupal beállítás problémája, hanem a webszerveré. Kérd meg a szolgáltatódat, hogy állítsa be a domain-eket, hogy ugyan arra a könyvtárra mutassanak. Után léphetsz tovább. Pl.: a sites/hu.tiborg.info/settings.php-ben egyszerűen csak beállítod, hogy az alapértelmezett nyelv a magyar a sites/tiborg.hu/settings.php-ban pedig beállítod, hogy offline és már kész is vagy. A settings.php végén találhatsz erre mintákat, de javasolt átolvasni az egészet ;)

pp