WordPress na platformie Amazon AWS EC2 – cz.7

Czego WordPress potrzebuje do życia?

WordPress korzysta z różnych dodatkowych modułów apache-a i PHP. Niestety w oficjalnej dokumentacji brak na ten moment informacji o tym co jest potrzebne do działania niektórych funkcjonalności. Można znaleźć w sieci opracowania na ten temat, ale mają one już ładnych kilka lat. W tej części pokażę kilka funkcjonalności WordPressa, które nie działają w naszym środowisku i powiem jak sobie z tym poradzić.

Przyjazne linki

Na początek, spróbujmy włączyć obsługę przyjaznych linków (pretty URLs). To pomaga nam uczynić adresy URL bardziej czytelnymi i przyjaznymi dla SEO naszego bloga. Zalogujmy się zatem do panelu administracyjnego, przejdźmy do zakładki Ustawienia->Bezpośrednie odnośniki (Settings->Permalinks). Tam wybierzmy którąś z wersji, która nam odpowiada. Po zapisaniu ustawień przejdźmy do strony głównej i spróbujmy kliknąć w tytuł wpisu. Ups…

Problemem w tej sytuacji jest wyłączony moduł przepisywania linków w naszym apache-u. W takim razie włączmy go:

Tak znacznie lepiej. 🙂

ec2_wordpress_permalinks2

wp_mail

W poprzedniej części pisałem o tym, że nasz WordPress nie jest w stanie wysyłać e-maili i o wtyczce pozwalającej wysyłać je za pośrednictwem SMTP. Zainstalujmy ją z naszego panelu administracyjnego. Oczywiście możemy też użyć do instalacji WP-CLI, albo wrzucać pliki ręcznie. Zanim jednak przejdziemy do instalacji samej wtyczki, doinstalujmy do PHP jeszcze jeden moduł. Nie jest on niezbędny w tej chwili, bo WordPress już od jakiegoś czasu umie sobie radzić bez niego, ale niektóre wtyczki mogą bez niego nie działać.

Zainstalujmy teraz wtyczkę Easy WP SMTP (lub inną o tej samej funkcjonalności) i skonfigurujmy ją tak samo jak konfigurowalibyśmy klienta pocztowego takiego jak Outlook czy Thunderbird.

ec2_smtp

Ta wtyczka posiada możliwość wysłania testowego e-maila, z czego warto skorzystać, żeby upewnić się, że wszystko działa jak należy. Jeśli korzystasz z innej wtyczki, która nie ma takiej funkcji, możesz spróbować na przykład zmienić hasło dla swojego użytkownika. Powinno to spowodować wysłanie wiadomości e-mail z informacją o zmianie hasła na adres przypisany do konta.

Skalowanie i kadrowanie obrazków

Kiedy do biblioteki mediów w WordPressie wrzucamy obrazek, dostajemy w efekcie z automatu kilka rozmiarów do wyboru. Dodatkowo mamy możliwość korzystania z wbudowanego, prostego edytora grafiki, który pozwala nam na przykład wykadrować obrazek. Tak przynajmniej być powinno, bo w tej chwili przy próbie włożenia obrazka do treści posta mamy do dyspozycji jedynie pełny rozmiar.

ec2_wordpress_image_size

Dzieje się tak z powodu brakującego modułu PHP o nazwie imagick. Zainstalujmy go. Przy okazji zainstalujemy też moduł GD. Wprawdzie WordPressowi wystarczy imagick, ale niektóre wtyczki mogą korzystać do obróbki grafiki właśnie z modułu GD.

Teraz po wrzuceniu nowego obrazka powinniśmy mieć możliwość skorzystania z automatycznie wygenerowanych rozmiarów, oraz korzystania z wbudowanego edytora.

ec_wordpress_image_size2

Dodatkowe moduły

Wykorzystywanym czasem w różnych wtyczkach modułem jest mcrypt. Skoro zatem jesteśmy jeszcze na etapie konfiguracji, doinstalujmy go przy okazji.

Taki zestaw rozszerzeń powinien zapewnić bezproblemowe działanie w większości przypadków.

To już właściwie wszystko w tej serii. W następnej (i ostatniej zarazem) części krótkie podsumowanie tego, co udało nam się zrobić oraz kilka końcowych uwag i wskazówek.

Część 1
Część 2
Część 3
Część 4
Część 5
Część 6
Część 8

WordPress na platformie Amazon AWS EC2 – cz.6

Instalacja WordPress-a

W tej części zajmiemy się instalacją samego WordPress-a na wstępnie skonfigurowanym środowisku. Ja użyję w tym celu WP-CLI, czyli narzędzia służącego do zarządzania wordpressem z poziomu linii poleceń. Jest to bardzo wygodne narzędzie, jeśli jeszcze nie miałeś okazji się z nim zetknąć, to bardzo polecam!

W tej części zakładam, że posiadasz domenę pod którą będziesz chciał uruchomić swojego wordpressa. Konieczne będzie wpisanie do rekordu A Twojej domeny, adresu IP Twojej instancji. Pamiętaj, że taka zmiana może być widoczna dopiero po kilku, a nawet kilkunastu godzinach. Jeśli masz wątpliwości dotyczące tego jak przeprowadzić ten proces, skontaktuj się z usługodawcą u którego utrzymujesz domenę.

Apache Virtual Host

Na dobry początek pogrzebiemy jeszcze odrobinę w konfiguracji. W tej chwili nasz serwer skonfigurowany jest w taki sposób, że cały ruch kierowany jest do folderu /var/www/html. Możemy to jednak zmienić konfigurując tzw. wirtualny host. W ten sposób bazując na różnych kryteriach, możemy kierować osoby trafiające do naszej maszyny w różne miejsca. Najpopularniejszym sposobem rozstrzygania gdzie powinna trafić osoba konkretna osoba, jest adres strony wpisany w pasku przeglądarki. Możemy zatem dodać nową konfigurację dla naszej strony na wordpressie. Ja użyję domeny wordpress.marchel.it. Tworzymy plik konfiguracyjny (nazwa jest dowolna, ale musi kończyć się na .conf):

sudo nano /etc/apache2/sites-available/wordpress-marchel-it.conf

i uzupełniamy go następującą treścią:

O co tu chodzi?
VirtualHost otwiera blok w którym definiujemy wszystkie opcje dotyczące naszego wirtualnego hosta. Symbol gwiazdki oznacza, że sprawdzane są połączenia ze wszystkich adresów IP jakie ma przypisane serwer (w naszym przypadku jest to tylko jedno publiczne IP, ale może być ich wiele). Dwukropek jest separatorem, a liczba 80 to port dla usługi HTTP, na którym serwer oczekuje połączeń.
ServerName służy do identyfikacji że właśnie o ten wirtualny host pyta przeglądarka, zatem będzie to po prostu nasza domena.
ServerAlias daje nam możliwość zdefiniowania dodatkowych nazw naszego serwera. W powyższym przykładzie dodałem przedrostek www, dzięki czemu osoba które wpisze w przeglądarce adres z takim przedrostkiem, również trafi na odpowiednią stronę.
DocumentRoot służy do określenia głównego katalogu naszej strony. Ja wymyśliłem sobie ścieżkę /var/www/wordpress-marchel-it/public_html. Ścieżka to oczywiście musi istnieć, dlatego utwórzmy ją i nadajmy jej odpowiednie uprawnienia:

Pierwsze dwie linijki to oczywiście utworzenie folderów. W linijce trzeciej zmieniamy właściciela folderu public_html na www-data i przypisujemy ten folder do grupy www-data. Właścicielem plików musi być użytkownik, z prawami którego uruchamiane są skrypty PHP (w naszym przypadku www-data) – w innym przypadku nie będziemy mogli bezpośrednio instalować na przykład wtyczek.

Uwaga!
Jeśli uruchamiasz na jednym serwerze więcej niż jedną stronę, takie ustawienia mogą być potencjalnie niebezpieczne! W takim przypadku dla każdej aplikacji powinien zostać utworzony nowy użytkownik, z prawami którego będzie ona uruchamiana.

Ostatnia linijka to zmiana uprawnień folderu – możliwe do odczytu, zapisu i wykonywania dla właściciela i grupy.

Directory otwiera blok, w którym będziemy mogli skonfigurować różne opcje, dla podanej ścieżki.
Options daje nam możliwość włączenia lub wyłączenia dodatkowych funkcjonalności serwera. W tym przypadku wyłączamy opcję indeksowania katalogów – jeśli jakiś katalog nie ma pliku index, to jego zawartość nie zostanie wylistowania, zamiast tego zostanie zwrócony błąd 403 – dostęp zabroniony. Dodatkowo ustawiamy możliwość „podążania” za linkami symbolicznymi co będzie nam potrzebne do korzystania z przyjaznych linków (pretty urls) w wordpressie.
AllowOverride All daje możliwość nadpisywania ustawień serwera przy pomocy plików .htaccess, z czego WordPress korzysta.
Require All Granted pozwala wszystkim na dostęp do folderu, czego oczywiście potrzebujemy, jeśli chcemy opublikować stronę internetową.

Możemy zapisać tak utworzony plik. Za chwilkę do niego wrócimy.

Instalacja PHP-CLI oraz WP-CLI

Zainstalowana przez nas w poprzednim odcinku wersja PHP działa tylko przy współpracy z serwerem WWW. Nie mamy możliwości „ręcznego” wykonywania skryptów z konsoli. Ponieważ WP-CLI napisany jest w PHP, musimy zapewnić mu środowisko, w którym będzie mógł działać. Tym razem nie będzie żmudnej konfiguracji, ot po prostu jedna linijka:

sudo apt-get install php5-cli

Świetnie! Teraz pobierzmy WP-CLI, postępując zgodnie z instrukcją na stronie projektu. Warto przejść najpierw do swojego katalogu domowego, jeśli jesteśmy aktualnie w innej lokalizacji (można to zrobić wydając polecenie cd ~/)

Upewnijmy się, czy działa:

Teraz warto byłoby uczynić WP-CLI dostępne globalnie, dlatego musimy nadać mu uprawnienia do wykonywania oraz przenieść do folderu, który figuruje w zmiennej PATH.

Teraz wydanie polecenia wp --info powinno zwrócić taki sam wynik.

Utworzenie nowej bazy MySQL

Ostatnim krokiem przed przystąpieniem do instalacji samego wordpressa, jest utworzenie pustej bazy danych, z której nasz blog będzie korzystać. Zróbmy to zatem. Musimy zalogować się jako root do naszego serwera mysql. Robimy to wydając polecenie:

Co oznacza, że logujemy się jako root i zostaniemy zapytani o hasło, które wcześniej zdefiniowaliśmy w procesie instalacji.

Następnie wykonujemy 3 zapytania SQL:

Pierwsze tworzy bazę danych o nazwie db_name i kodowaniu utf8mb4. Bardzo dobre wytłumaczenie zawiłości tematu kodowania znaków można znaleźć tutaj.

Drugie przyznaje wszystkie uprawnienia do zarządzania bazą db_name użytkownikowi user_name, który autoryzuje się hasłem password. Jeśli taki użytkownik nie istnieje, zostanie utworzony.

Trzecie przeładowuje uprawnienia, tak dla pewności.

Następnie wychodzimy z konsoli mysql prostym poleceniem exit.

Czas na WordPress-a

Doszliśmy w końcu do momentu, o który przecież głównie chodzi w całym tym cyklu, czyli do instalacji WordPress-a. Tak jak wspomniałem wyżej użyjemy w tym celu WP-CLI. Mamy już utworzony folder, w którym znajdzie się nasza instalacja, więc przejdźmy do niego, w moim przypadku znajduje się on w /var/www/wordpress-marchel-it/public_html:

Teraz musimy pobrać pliki wordpressa:

Jeśli chcielibyśmy bliżej zapoznać się z jakimś poleceniem, możemy poprzedzić je słówkiem help, na przykład wp help core, czy wp help core download. W przypadku powyższego polecenia zostanie pobrana najnowsza wersja WordPress-a z pakietem językowym en_US. Jeśli chcielibyśmy pobrać inną wersję językową (na przykład Polską) możemy dodać parametr –locale=pl_PL

Teraz musimy wygenerować plik wp-config.php, w którym znajdą się między innymi dane dostępowe do utworzonej przed chwilą bazy danych. Musimy więc podać co najmniej nazwę bazy danych, nazwę użytkownika oraz hasło. Domyślnie dla tabel zostanie użyty prefix „wp_”, ale oczywiście możemy to zmodyfikować dodając odpowiednie argumenty.

Oczywiście w miejsce powyższych wartości należy podać te, które zostały użyte podczas tworzenia bazy.

Pozostało nam przeprowadzić proces instalacji, który utworzy tabele w bazie danych i ustawi dla nas kilka wartości, takich jak tytuł strony itp.

W polu URL podajemy adres pod jakim nasz blog będzie osiągalny – dla mnie jest to wordpress.marchel.it.
title to tytuł naszej witryny. Jeśli pojawią się w nim spacje musimy zamknąć go w cudzysłowach.
admin_user to pole w którym ustalamy jak będzie nazywał się nasz użytkownik.
admin_password ustala hasło dla użytkownika
admin_email to adres email, z którego korzysta wordpress dla celów administracyjnych.

W trakcie instalacji prawdopodobnie pojawiła się następująca informacja:

sh: 1: /usr/sbin/sendmail: not found

Oznacza to tylko tyle, że program służący do wysyłania wiadomości email nie jest zainstalowany w naszym systemie. Nie będę w tym tutorialu omawiać konfiguracji działania poczty w domyślny dla WordPress-a sposób. Zamiast tego proponuję użyć jednej z dostępnych wtyczek, pozwalających wysyłać pocztę za pośrednictwem protokołu SMTP. Ja korzystam z Easy WP SMTP. Konfiguracja sprowadza się do wpisania loginu i hasła dla naszego użytkownika poczty, oraz serwera przez który ma się odbywać komunikacja i sposobu szyfrowania tej komunikacji. Dokładnie to samo robimy konfigurując Outlooka, czy Thunderbirda.

Wszystko jest już gotowe. Zostało nam zatem włączyć konfigurację, którą przygotowaliśmy w pierwszym punkcie tej części i odwiedzić stronę w przeglądarce. 🙂

ec2_wordpress

Super! Udało nam się uruchomić WordPressa. W następnej części pokażę, że chociaż na pierwszy rzut oka wszystko jest w porządku, to jednak kilka rzeczy nie działa jeszcze tak jak powinno. Zajmiemy się też rozwiązaniem tych problemów.

Część 1
Część 2
Część 3
Część 4
Część 5
Część 7
Część 8

WordPress na platformie Amazon AWS EC2 – cz.5

Apache, PHP, MySQL

Do uruchomienia wordpressa będziemy potrzebować kilku dodatkowych narzędzi. Po pierwsze musimy zainstalować serwer, który będzie oczekiwał na żądania z przeglądarek użytkowników i zwracał im gotowe strony. W tej roli wystąpi Apache. Ponieważ wordpress napisany jest w PHP, potrzebujemy zainstalować interpreter tego języka. Na koniec konieczna jest instalacja serwera baz danych bez której nasz blog nie będzie działał. WordPress zaprojektowany jest aby współdziałać z MySQL, dlatego też taką bazę musimy zainstalować.

Instalacja Apache

W celu zainstalowania apache-a musimy połączyć się z naszą instancją przez SSH, a następnie wykonać następujące polecenie:

sudo apt-get update && sudo apt-get install apache2

Tak jak opisywałem w poprzedniej części sudo apt-get update spowoduje pobranie informacji o najnowszych dostępnych wersjach pakietów z repozytorium ubuntu. Operator && oznacza: „jeśli polecenie po lewej stronie wykona się poprawnie wykonaj polecenie po prawej stronie”. Część sudo apt-get install apache2 uruchamia instalację pakietu apache2.

Po tej operacji wpisanie w przeglądarce adresu IP naszego serwera, powinno dać nam taki wynik jak poniżej, co oznacza, że nasz serwer działa. 🙂

ec2_apache

Przed przejściem dalej warto upewnić się, że nasz apache używa modułu mpm-events, a nie mpm-prefork. Jest to podyktowane wydajnością. U mnie ten moduł był domyślnie zainstalowany i włączony po instalacji apache-a. Możesz to sprawdzić przy pomocy komendy, która wypisze wszystkie aktywne moduły:

sudo apache2ctl -M

W razie potrzeby możesz doinstalować ten moduł:

sudo apt-get install apache2-mpm-event
sudo a2enmod mpm_event
sudo service apache2 restart

Instalacja PHP

W repozytorium ubuntu 14.04 najnowsza wersja PHP nosi numer 5.5.9. Jeśli chcielibyśmy zainstalować nowszą wersję, np. 5.6.x konieczne będzie skorzystanie z dodatkowych repozytoriów.

Przejdźmy zatem do instalacji. Tak jak zaznaczyłem na początku tej serii, będę chciał skorzystać z PHP5-FPM. Wybór ten podyktowany jest głównie wydajnością. Tutaj można przeczytać porównanie mod_php i php-fpm. Wydajemy polecenie:

sudo apt-get install php5-fpm

Żeby taka instalacja PHP chciała współpracować z apachem musimy doinstalować do niego dodatkowy moduł. Ze względu na zawiłości licencyjne, jest on dostępny w repozytorium multiverse, które domyślnie jest wyłączone, więc najpierw musimy je włączyć. O różnicach między repozytoriami można poczytać tutaj. Otwórzmy w ulubionym edytorze tekstowym plik /etc/apt/sources.list (ja korzystam z nano)…

sudo nano /etc/apt/sources.list

… i odkomentujmy odpowiednie linijki (adresy URL mogą różnić się w zależności od regionu):

ec2_sources

Po zapisaniu zmian w pliku możemy już wydać polecenia:

sudo apt-get update
sudo apt-get install libapache2-mod-fastcgi

Po instalacji moduł powinien zostać automatycznie włączony, a apache zrestartowany.

ec2_fcgi

Jeśli tak się jednak nie stało, zawsze możemy przeprowadzić aktywację modułu i restart serwera ręcznie wydając następujące polecenia:

sudo a2enmod fastcgi
sudo service apache2 restart

UWAGA!
Jeśli miałeś wcześniej zainstalowane mod_php, musisz je wyłączyć. Możesz to zrobić w analogiczny sposób:

sudo a2dismod php5
sudo service apache2 restart

Przed nami jeszcze odrobina konfiguracji. Zakładam, że na naszej instancji będzie uruchomiona tylko jedna witryna, zatem przedstawiona poniżej konfiguracja jest prawdopodobnie najprostszą z możliwych. Zacznijmy od włączenia jeszcze dwóch modułów, które będą nam potrzebne:

sudo a2enmod alias actions
sudo service apache2 restart

Teraz musimy stworzyć plik konfiguracyjny, który powie apache-owi co powinien zrobić z plikami PHP. Wszystkie pliki konfiguracyjne przechowywane są w folderze /etc/apache2/conf-available, dlatego tam też stworzymy nasz plik. Ja nazwę go php5-fpm.conf. Możemy to zrobić na przykład przy pomocy nano:

sudo nano /etc/apache2/conf-available/php5-fpm.conf

Następnie umieszczamy w nim następują treść:

Krótkie wyjaśnienie dla chętnych 🙂
IfModule sprawdza czy moduł jest aktywny i jeśli jest, wykonuje polecenia zawarte w bloku.
AddHandler powoduje, że dla podanych rozszerzeń plików wykonywana będzie zadana akcja – w tym przypadku dla plików .php, wykonana zostanie akcja „php5-fcgi”.
Action definiuje program do którego zostanie przesłane żądanie, kiedy zostanie wykonana akcja – w tym przypadku dla akcji php5-fcgi żądanie zostanie skierowane na ścieżkę /php5-fcgi
Alias służy do mapowania ścieżek – w tym przypadku definiujemy, że ścieżka /php5-fcgi z poprzedniej linijki, to tak naprawdę /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer wskazuje w jaki sposób obsłużyć plik, który złapaliśmy powyższymi linijkami – w tym przypadku zostanie on wykonany przez serwer nasłuchujący na gnieździe unixowym na ścieżce /var/run/php5-fpm.sock. Ta ścieżka jest zdefiniowana w pliku konfiguracyjnym php-fpm. Możesz to sprawdzić – znajdziesz go tutaj: /etc/php5/fpm/pool.d/www.conf. Opcja -pass-header daje nam możliwość przekazania do skryptu nagłówków HTTP, które normalnie nie zostałyby przekazane, np. ujętego w powyższej konfiguracji nagłówka Authorization.
Directory określa ścieżkę, którą obejmą ustawienia zdefiniowane w bloku
Require all granted pozwala na odczyt lokalizacji przez wszystkich – musimy dodać tą linijkę, w innym wypadku zamiast efektów działania dowolnego skryptu PHP zobaczymy w przeglądarce odmowę dostępu.

Nie pozostało nam nic innego, jak zapisać konfigurację, włączyć ją i przetestować czy wszystko działa. Zapisujemy plik, wychodzimy z edytora, wydajemy polecenia:

sudo a2enconf php5-fpm
sudo service apache2 reload

Teraz utwórzmy plik php, dzięki któremu przetestujemy to, co do tej pory zrobiliśmy. Domyślna konfiguracja apache-a kieruje nas na ścieżkę /var/www/html, więc tam też utworzymy nasz plik:

sudo nano /var/www/html/info.php

o treści:

Po zapisaniu pliku przechodzimy pod adres naszego serwera – w moim przypadku będzie to: http://52.29.70.252/info.php. Powinniśmy zobaczyć znajomą stronę PHP Info. 🙂

ec2_phpinfo

Instalacja MySQL

Teraz będzie już z górki. Uruchamiamy instalację serwera MySQL i modułu php, który będzie używany do komunikacji z bazą danych. Wydajemy polecenie:

sudo apt-get install mysql-server php5-mysql

W trakcie instalacji zostaniemy poproszeni o utworzenie hasła dla głównego użytkownika (root) naszej bazy danych. Możemy je wprowadzić teraz, albo zostawić pole hasła puste. Za chwilę wrócimy do tego kroku.

Po zakończonej instalacji uruchamiamy skrypt, który przygotuje do działania naszą bazę, między innymi stworzy odpowiednią strukturę folderów.

sudo mysql_install_db

Na koniec uruchamiamy skrypt, który przeprowadzi nas przez kilka kroków prowadzących do lepszego zabezpieczenia naszego serwera.

sudo mysql_secure_installation

W pierwszym kroku zostaniemy zapytani o aktualne hasło dla użytkownika root. Jeśli ustawiliśmy je podczas instalacji, wpiszmy je teraz. Jeśli nie, naciskamy po prostu enter.

Drugi krok to ustawienie hasła roota. Jeśli mamy już hasło, w tym kroku możemy je zmienić.

Krok trzeci pozwala nam na usunięcie anonimowego użytkownika, czyli możliwości logowania się bez faktycznego posiadania konta. Oczywiście usuwamy.

W kroku czwartym możemy określić, że użytkownik root może zalogować się tylko z komputera, na którym uruchomiony jest serwer (localhost). Potwierdzamy wyłącznie zdalnego logowania.

W kroku piątym możemy usunąć bazę ‚test’, która domyślnie jest utworzona na etapie instalacji i jest dostępna dla wszystkich. Potwierdzamy chęć usunięcia.

Ostatnim etapem jest przeładowanie tabeli uprawnień. Potwierdzamy.

Uff… Dobrnęliśmy do końca. Mamy już prawie wszystko, czego potrzebujemy do uruchomienia naszego wordpressa. Do zobaczenia w następnym odcinku. 🙂

Część 1
Część 2
Część 3
Część 4
Część 6
Część 7
Część 8