hood

Jak działa multisite w Drupalu

Drupal multisite to instalacja, która pozwala używać pojedynczej bazy kodu do obsługi wielu witryn internetowych. W tym poście wyjaśnię szczegółowo, jak działa multisite w Drupalu, jakie podejścia można zastosować, aby skonfigurować instalację. Wyjaśnię również niektóre ustawienia, które mogą być ważne dla trybu multisite, a które nie mają zastosowania przy tworzeniu pojedynczej witryny w Drupalu.

Podstawy domyślnego Drupala multisite

Witryna drupalowa składa się z kilku głównych elementów:

  1. Rdzenia Drupala
  2. Modułów niestandardowych i contrib
  3. Motywu
  4. Bazy danych
  5. Konfiguracji

Kiedy żądanie z przeglądarki jest obsługiwane przez Drupala, jedną z pierwszych rzeczy, które robi Drupal, jest bootstrapping bazy danych i ładowanie konfiguracji. Z bazy danych i konfiguracji system wie:

  • które z dostępnych modułów i motywów są włączone,
  • jak wszystko ustawiono:
    • gdzie znajdują się foldery z plikami publicznymi i prywatnymi,
    • gdzie są poszczególne bloki,
    • jakie treści są dostępne,
    • co znajduje się na głównej stronie,
    • jakie menu znajdują się w których regionach i jakie łącza znajdują się w których menu, 
    • praktycznie wszystko na temat konfiguracji witryny. 

Aby połączyć się z bazą danych, Drupal odczytuje informacje o połączeniu, które są przechowywane w pliku settings.php (który zwykle znajduje się w folderze /sites/default).

Zwróć uwagę na folder default. Nazywa się go domyślnym ("default"), ponieważ jest folderem rezerwowym, jeśli nie znaleziono innych folderów. W pojedynczej instalacji Drupala zazwyczaj nie są konfigurowane żadne inne foldery, a większość witryn internetowych jest uruchamiana z folderu domyślnego.

Jednak w przypadku instalacji wielowitrynowej tworzy się osobne foldery dla osobnych witryn internetowych.

Na przykład:

  • /sites/example-one.com
  • /sites/example-two.com

Jeśli utworzymy takie foldery, nowe żądanie zbada domenę podstawową (podstawowy adres URL, jak nazywa go Drupal) i spróbuje dopasować ją do właściwego folderu. Kolejność jest następująca:

Gdy przychodzi żądanie z podstawowym adresem URL www.example-one.com, Drupal sprawdza, czy istnieje:

  1. Folder o nazwie /sites/ www.example-one.com i szuka w nim settings.php.
  2. Jeśli nie istnieje, Drupal sprawdzi folder domeny wyższego rzędu – w tym przypadku: /sites/example-one.com.
  3. Jeśli nie znajdzie tam settings.php, przejdzie do /sites/default.

Posiadamy multisite – wiele witryn w ramach jednej bazy kodu

Jeśli posiadamy 2 foldery dla 2 różnych domen, możemy mieć 2 oddzielne pliki settings.php, które łączą Drupala z dwiema osobnymi bazami danych, które zaś ładują osobne konfiguracje i używają różnych uruchomionych modułów oraz motywów.

Zasadniczo otrzymujemy 2 różne witryny internetowe, które mają własne bazy danych, treść, pliki i konfiguracje, mimo że korzystają z jednego kodu drupalowego.

Jeśli dodamy kolejne foldery, otrzymamy następne witryny internetowe – bez konieczności powielania kodu.

Drupal może obsługiwać setki witryn internetowych z jednej takiej instalacji.

Plik sites.php pozwala mapować domeny pod kątem folderów

Aby pomóc w mapowaniu podstawowych adresów URL do folderów, Drupal oferuje plik sites.php, którego można użyć do przypisania podstawowych adresów URL do odpowiednich folderów.

W folderze /sites/ widzimy plik o nazwie example.sites.php. Zmień jego nazwę na sites.php, a Drupal go użyje. Konfiguracja mapowań jest dość prosta:

$sites['an-old-domain-to-map.coom'] = 'example-one.com;

Ten plik pozwala nam mapować kilka domen do jednej witryny internetowej, jeśli zajdzie się taka potrzeba. Pomaga to bardzo w programowaniu, ponieważ środowiska programistyczne zwykle mają inne adresy URL niż te produkcyjne.

$sites['localhost.example'] = 'example.com';

Niektóre zespoły programistów używają tej funkcji również do utrzymywania przejrzystości folderu z witrynami, gdy obecnych są setki witryn internetowych z różnymi domenami – czasami w obcych językach. Zespół programistów może używać krótkich i prostych nazw folderów.

$sites['nom-de-domaine-de-marque-tres-long.fr
'] = 'brand-x-fr;

Jest to również przydatne, jeśli domena jednej z witryn internetowych ulegnie zmianie.

Które witryny mogą używać których modułów

Zazwyczaj jesteśmy przyzwyczajeni do sytuacji, w której: 

  • wszystkie moduły są umieszczane w katalogu modules (lub sites/all/modules w Drupalu 7 i wcześniejszych wersjach),
  • wszystkie motywy są umieszczane w katalogu themes (lub sites/all/themes w Drupalu 7 i wcześniejszych wersjach).

Jeśli w systemie mamy pojedynczą witrynę internetową, nie ma potrzeby stosowania dodatkowej konfiguracji. Dodajemy tylko te moduły, których potrzebujemy.

Jednak w przypadku instalacji multisite może zaistnieć potrzeba określenia, które witryny internetowe mogą używać poszczególnych modułów lub motywów. W dużym systemie z setkami witryn internetowych i administratorów takie ograniczenia mogą mieć kluczowe znaczenie dla zezwalania w każdej witrynie jedynie na takie funkcjonalności, które dobrze ze sobą współpracują.

Możemy to kontrolować na 2 sposoby:

1. Poprzez profile instalacji

Każda drupalowa witryna jest zbudowana na profilu instalacyjnym. Zwykle jest to profil standardowy lub minimalny, który Drupal oferuje już na samym początku. Wybierasz pomiędzy nimi podczas instalacji Drupala i możesz je zobaczyć w folderze /core/profiles. Żaden z tych profili nie oferuje modułów ani motywów, ale profil może je zapewnić.

Na przykład: Drupal jest dostarczany z profilem demo_umami, który stanowi profil demonstracyjny i zawiera zarówno moduł demo_umami_content, jak i motyw umami. Jeśli przeprowadzisz standardową instalację, nie będziesz na przykład mieć dostępu do motywu umami z panelu administratora.

Jeśli musisz kontrolować, które witryny internetowe mają dostęp do których motywów lub modułów, umieszczasz je w swoich niestandardowych profilach instalacji. Jedynie witryny internetowe zainstalowane w określonym profilu instalacyjnym będą mogły korzystać i mieć dostęp do tego, co zapewnia.

Fajne jest to, że profile pozwalają na dziedziczenie. Możesz na przykład utworzyć jeden profil z modułami Drupal commerce, a następnie 2 dodatkowe profile podrzędne, które będą miały dostęp do modułów Drupal commerce.

Realizując usługi drupalowe dla naszych klientów, implementowaliśmy różne scenariusze o różnym stopniu szczegółowości. Możliwości są tu nieograniczone. Możesz nawet utworzyć profil podrzędny dla każdej witryny, aby uzyskać bardzo szczegółową kontrolę. Może to być już jednak lekka przesada.

2. Przez moduły witryny za pośrednictwem folderu witryny

Moduły i motywy można również dodawać do folderu witryny. W naszym przykładzie, moglibyśmy umieścić je w:

  • sites/example-one.com/modules
  • sites/example-one.com/themes

Moduły i motywy umieszczone w tych katalogach będą dostępne jedynie dla witryny internetowej example-one.com.

Zasadniczo powinieneś unikać umieszczania tu zbyt wielu modułów, ponieważ posiadanie zupełnie innego kodu dla każdej witryny jest raczej sprzeczne z koncepcją multisite, ale czasami istnieje potrzeba dodania kilku osobnych poprawek dla witryn lub utworzenia dla każdej z nich motywu podrzędnego, który pozwala obejść kilka elementów we wspólnym motywie podstawowym.

Aktualizacja kodu jeden raz zamiast 100 razy

Jedną z największych zalet multisite jest łatwiejsze utrzymanie. Jeśli posiadasz 100 witryn internetowych w jednym systemie i pojawi się nowa wersja Drupala, wystarczy zaktualizować kod tylko raz zamiast 100 razy.

Pamiętaj jednak, że ustawienia i bazy danych są osobne dla wszystkich 100 witryn internetowych. Musisz uruchomić skrypt update.php dla każdej z nich osobno!

Podsumowanie

Powyżej szczegółowo wyjaśniłem, jak działa mechanizm multisite w Drupalu. W istocie jest to bardzo prosta, a jednocześnie potężna funkcja Drupala, która pozwala firmom zmniejszyć koszty utrzymania i długu technicznego, oraz ułatwia pracę osobom, które muszą utrzymywać wiele witryn internetowych.

W ramach wsparcia dla Drupala utrzymujemy istniejące strony internetowe i rozbudowujemy je o nowe funkcjonalności