O instalowaniu aplikacji internetowych na wielu serwerach pisałem już w kilku artykułach, które dotyczyły skalowalności horyzontalnej serwerów czy zapewniania wysokiej niezawodności i ciągłości działania aplikacji webowych. W tym artykule pokażę jak zainstalować jednego WordPressa na wielu serwerach czyli jak dokonać skalowania horyzontalnego hostingu systemu WordPress.
Na początku odpowiedzmy sobie na pytanie: w jakim celu instalujemy jedną aplikację na wielu serwerach i jakie osiągamy przez to korzyści? Otóż, kiedy aplikacja webowa jest zainstalowana na jednym serwerze to ten serwer staje się pojedynczym punktem awarii. Oznacza to, że w przypadku jego awarii lub prac serwisowych strona po prostu przestanie działać. Instalacja serwisu internetowego na powiedzmy dwóch serwerach rozwiązuje ten problem, bo kiedy jeden z serwerów przestanie działać to nasza aplikacja dalej będzie funkcjonować. Obsługę żądań HTTP przejmie na siebie ten drugi – działający serwer. Podobnie sprawa wygląda z aktualizacjami samego systemu lub z pracami serwisowymi dotyczącymi samego hostingu.
Instalacja systemu WordPress na wielu serwerach może być też odpowiedzią na spory ruch. Niezależnie czy dysponujemy fizycznymi maszynami lub tworzymy maszyny wirtualne w ramach chmury np. Google Cloud, to w pewnym momencie wyczerpiemy możliwości jednej instancji. Skalowanie wertykalne (w pionie) staje się coraz bardziej nieefektywne. Instalując WordPressa na wielu maszynach i przygotowując go do pracowania w takim trybie mamy możliwość skalowania hostingu zarówno w górę jak i w dół. Kiedy w danym okresie trzeba w niezawodny sposób obsłużyć duży ruch możemy dołożyć pewną liczbę instancji. Kiedy okazuje się, że infrastruktura serwisu jest używana w stosunkowo małym stopniu to możemy odjąć ilość serwerów bez jakiejkolwiek przerwy w działaniu. Instalując WordPressa na jednym serwerze musimy niejako „w ciemno” wycelować jakie parametry będą wystarczające i pilnować aby nie marnować środków – to jest bardzo trudne tym bardziej w początkowych fazach rozwoju aplikacji. Zmiana konfiguracji serwera zawsze wymaga wykonania restartu maszyny – nawet w środowiskach wirtualizowanych – co spowoduje przerwę w działaniu naszego serwisu.
Przewodnik dotyczy infrastruktury tworzonej w całości w Google Cloud ale podobny efekt można osiągnąć w dowolnej chmurze lub wykorzystując usługi i sprzęt wielu różnych dostawców.
Krok 1: Instalacja WordPressa na dwóch maszynach
Pierwszy krok będzie polegał na uruchomieniu dwóch niezależnych serwerów i zainstalowaniu na nich WordPressa. Powinny to być dwa serwery LAMP. Możliwość przetestowania działającego systemu WordPress wykluczy przypadkowe pomyłki i pozwoli na łatwe przetestowanie działania systemów do równoważenia obciążenia. Aby maksymalnie przyspieszyć prace, można zainstalować WordPressa na jednym serwerze a następnie skopiować dysk lub stworzyć obraz maszyny i automatycznie stworzyć identyczną instancję.

Tworzę zatem dwie instancje Compute Engine i instaluję na nich pakiet LAMP zgodnie z artykułem tworzenie własnego hostingu WordPress. Jeżeli serwisy działają i odwiedziny na stronach dostępnych za pomocą adresów IP kończą się wyświetleniem domyślnej strony głównej WordPressa to możemy przejść do następnego kroku.

W tym kroku utworzyliśmy dwa serwery WordPress, które są dostępne z Internetu za pomocą własnych adresów IP.
Krok 2: Delegacja bazy danych do Cloud SQL
Aby serwery obsługiwały jeden logiczny serwis WordPress, baza danych musi być jedna – hostowana w osobnej usłudze lub na osobnym serwerze. Do tego świetnie nadaje się usługa Cloud SQL. Tworzę instancję Cloud SQL zgodnie z przewodnikiem zamieszczonym w artykule Google Cloud SQL – zalety zarządzanych baz danych.

Tworzymy bazę danych wordpress i w panelu Połączenia dodajemy adresy IP naszych instancji. Jeżeli pominęliśmy instalację serwera MySQL to w tym momencie możemy przystąpić do instalacji WordPressa wykorzystując dane do połączenia z bazą danych Cloud SQL. Jeżeli zainstalowaliśmy WordPressa na lokalnych serwerach MySQL wystarczy w plikach wp-config.php podmienić dane lokalnej bazy danych na przed chwilą utworzoną bazę danych Cloud SQL.

W ten sposób dwa serwery współdzielą bazę danych i na dwóch niezależnych serwerach mamy tę samą bazę danych. Próba wejścia na serwer, którego adres IP jest wpisany w bazie danych powinna przebiegać bez problemu natomiast próba połączenia z drugim serwerem powinna kończyć się przekierowaniem – za to przekierowanie jest odpowiedzialny WordPress.
Krok 3: Tworzenie grupy instancji
W tym momencie chcemy używać jednego adresu IP (lub domeny) i do tego celu musimy utworzyć Load Balancer. Aby móc stworzyć Load Balancer dla naszych maszyn tworzę grupę instancji i dodaję do niej oba serwery:

Krok 4: Tworzenie systemu równoważenia obciążenia
Tworzę load balancer z koligacją sesji. Na początku konfigurujemy backend i wybieram utworzoną grupę instancji.
4.1 Konfiguracja backendu

Tworzę healthcheck czyli kontrolę stanu z odstępem 5s. To zapewni szybką reakcję load balancera na usterki i zapewni wysoką dostępność strony:

Ponieważ WordPress wykorzystuje sesje, musimy zapewnić koligację sesji czyli ich „stałość” dla konkretnych użytkowników. Istnieją liczne metody na zapewnienie dostępu do sesji w przypadku posiadania wielu serwerów HTTP. Jedną z nich opisywałem w artykule zapis sesji w bazie danych MySQL. Skoro jednak korzystamy już z load balancera wykorzystamy prostą i skuteczną koligację opartą na ciasteczkach. Load Balancer zainstaluje ciasteczko i w ten sposób „zapamięta” że dany klient ma trafiać do tego konkretnego hosta. To zapewni stałość sesji.
4.2 Koligacja sesji dla systemu WordPress
Klikam w link: Konfiguracje zaawansowane (nagłówki żądania i odpowiedzi, koligacja sesji, czasy oczekiwania, zamykanie połączeń i ustawienia CDN).

4.3 Konfiguracja frontendu
Tworzę statyczny adres IP i certyfikat SSL. Dodaję domenę i zmieniam rekordy A domeny na adres frontendu systemu równoważenia obciążenia.

Dokładny opis tych kroków można znaleźć w artykule: Instalacja certyfikatu SSL w Google Cloud. Po odczekaniu kilkunastu minut i po poprawnej certyfikacji domeny nasz serwis jest już dostępny za pomocą wybranej domeny. Osiągnęliśmy już zatem architekturę składającą się z loadbalancera, dwóch serwerów HTTP i serwera SQL:

Krok 5: Aktualizacja domeny w systemie WordPress
Nasz serwis działa i przyjął niemal ostateczną postać. W ustawieniach WordPressa musimy oczywiście zaktualizować domenę aby ścieżki do skryptów nie prowadziły do adresów IP maszyn jakie wytypuje load balancer, kiedy się z nim łączymy za pomocą domeny.
Najpierw wyłączam dodatkowy serwer i loguję się do panelu WordPressa za pomocą adresu IP tego serwera, który widnieje w polach home i siteurl. Instaluję wtyczkę Better Search Replace i podmieniam wszystkie wystąpienia http://adres_ip/ na https://nazwa-domeny.pl. Po tej zmianie WordPress będzie dostępny ale prawdopodobnie nie będziemy mogli uzyskać dostępu do panelu /wp-admin/ z powodu pętli przekierowań: ERR_TOO_MANY_REDIRECTS.
Do wp-config.php dodaję łatkę, która jest niezbędna kiedy korzystamy z load balancera:
$server_opts = array("HTTP_CLOUDFRONT_FORWARDED_PROTO" => "https", "HTTP_CF_VISITOR"=>"https", "HTTP_X_FORWARDED_PROTO"=>"https", "HTTP_X_FORWARDED_SSL"=>"on", "HTTP_X_FORWARDED_SSL"=>"1"); foreach( $server_opts as $option => $value ) { if ((isset($_ENV["HTTPS"]) && ( "on" == $_ENV["HTTPS"] )) || (isset( $_SERVER[ $option ] ) && ( strpos( $_SERVER[ $option ], $value ) !== false )) ) { $_SERVER[ "HTTPS" ] = "on"; } }
W sumie to mogliśmy zastosować łatkę i zmienić wartości w polach home i siteurl ale tak jest zdecydowanie szybciej.
Krok 6: Integracja WordPress z Cloud Storage
W ten sam sposób – czyli na obu serwerach – będziemy musieli wykonywać wszelkie instalacje wtyczek. Jedną z nich jest WP Offload Media, która jest niezbędna do tego aby pliki załadowane do biblioteki WordPressa były osiągalne niezależnie od tego z którym serwerem połączy nas load balancer.

Instrukcję dotyczącą tego jak zintegrować WordPressa z Cloud Storage opisałem w artykule: Integracja Google Cloud Storage z WordPressem.
Ostatni krok pozwoli nam utrzymywać stronę WordPress na wielu serwerach a koligacja sesji zapewni, że wszystkie funkcje WordPressa wraz z działaniami wykonywanymi w panelu administracyjnym będą działać prawidłowo. Alternatywne rozwiązania problemu koligacji sesji, przechowywania danych i wskazówki dotyczące migracji WordPressa na architekturę wieloserwerową można znaleźć w tym artykule:
Podsumowanie
Uruchomienie WordPressa na wielu serwerach nie jest aż tak skomplikowane jak mogłoby się początkowo wydawać. Load balancer zapewnił koligację sesji, usługa SQL utrzymuje bazę danych a dane lokalne wędrują na Cloud Storage. To wszystko wystarczy aby z powodzeniem utrzymywać i skalować serwis WordPress na wielu serwerach.
Odpowiedz lub skomentuj