czwartek, 28 lutego 2008

Lepsza baza - instalujemy serwer PostgreSQL

Dzisiaj krótka piłka - mam nadzieję :) Chyba najczęściej spotykanym systemem baz danych występującym w sieci w kwartecie z Linuksem, Apaczem i PHP jest MySQL. Nie jest to jednak jedyny i - jak się również okazuje - dla każdego najlepszy system. Takie jest przynajmniej moje zdanie :P Ja przykładowo szukałem jakiś czas temu alternatywy dla mojego sql'a, pozwalającej na komercyjne wykorzystanie w swoim projekcie. Nie będę się tutaj rozmieniał na drobne, ponieważ różne osoby różnie widzą możliwość komercyjnego użycia baz MySQL, a nie to jest tematem posta. Postanowiłem wykorzystać system baz danych PostgreSQL, który ze względu na swoją absolutną wolność i brak podziałów dostępnych licencji na różnego typu zastosowania, nie zmusza mnie do myślenia czy mogę na jego użyciu zarabiać czy nie. Postgres ma jeszcze jedną poważną zaletę - jest dostępny prawie wszędzie tam gdzie MySQL. Jest tak dzięki jego integracji z cPanelem, którego stosuje obecnie wiele firm hostingowych, zarówno tych oferujących swoje usługi odpłatnie jak i tych darmowych.


Niestety prawda jest taka, że niebieski słonik często zostaje przez użytkowników pomijany i przegrywa w starciu z delfinkiem ;P Nie ma się jednak co dziwić - większość oskryptowania dostępnego na rynku jest pisana pod MySQL'a, a instalując takie wyjątki jak popularne phpBB czy WikiMedia obsługujące również bez problemu Postgresa i tak odruchowo wybierany jest produkt Sunowski. Nie ma jednak co płakać - być może nadejdą lepsze dni dla PgSQL'a. Tymczasem zakończę swój wywód i przejdę szybko do sedna sprawy, dla której się tutaj dziś zebraliśmy ;)

Tak jak wspomniałem wykorzystanie bazy postgresowej na serwerze z cPanelem nie stanowi większego problemu - ot, klik, klik i nowa baza jest gotowa. Trochę inaczej to wygląda, gdy chcemy sami napisać aplikację korzystającą z systemu spod znaku słonia i musimy ją jakoś przetestować na localu zanim wypuścimy do sieci (no chyba, że stawiamy na całkowity hardcore i testujemy wszystko live: save, ftp, refresh :P Jeśli należysz do takiej grupy webmajstrów, to informuję iż źle trafiłeś). Wówczas koniecznością staje się (zupełnie jak w przypadku MySQL'a) instalacja serwera baz na lokalnym komputerze. Pojawia się tylko jedna mała przeszkoda - PgSQL nie wchodzi w skład XAMPPa, ani żadnego innego znanego Krasnala (przynajmniej ja nic o tym nie wiem) ;o Omgz! W takiej sytuacji pozostaje ręczna instalka. Już za chwilę będziecie wiedzieć jak to uczynić sprawnie i bezstresowo pod Fedorą.

Odpalamy terminal i logujemy się na roota. Instalujemy serwer baz, stosowny moduł dla PHP i phpPgAdmina:

yum install postgresql php-pgsql phpPgAdmin

Tip: Jeśli już wcześniej zainstalowano PHP (np zgodnie z moim tutorialem) i użyto do tego polecenia php\* to php-pgsql i phpPgAdmin powinny być już zainstalowane. Nie zaszkodzi jednak dodać ich do powyższego polecenia - najwyżej yum je sobie pominie.

Po zakończonej instalacji najpierw inicjalizujemy bazę, a następnie odpalamy serwer, logujemy się na użytkownika postgres i włączamy narzędzie psql:

service postgresql initdb
/etc/init.d/postgresql start
su postgres
psql

Tip: Przed logowaniem można sprawdzić w /etc/shadow czy użytkownik taki został utworzony podczas instalacji. Nazwa usera może aczkolwiek nie powinna różnić się od powyższej.

Tworzymy własnego użytkownika (login do bazy) - uwaga: operujemy tutaj zapytaniami sql'owymi, więc pamiętaj o średnikach na końcu linii!

create user sdr;

Ustawiamy hasło i nadajemy wszystkie uprawnienia, dzięki którym użytkownik otrzyma władzę absolutną nad serwerem :) Takie rzeczy to oczywiście tylko na localu - na serwerach dostępnych w sieci należy nadawać użytkownikom tylko takie uprawnienia jakich potrzebują (kwestia bezpieczeństwa). Podając hasło koniecznie umieść je w apostrofach:

alter user sdr password 'sR4tATa7A';
alter user sdr superuser;
alter user sdr createrole;
alter user sdr createdb;
alter user sdr createuser;

Na koniec tworzymy naszemu userowi domyślną bazę danych, do której będzie automatycznie logowany po uruchomieniu psql'a.

create database sdr owner sdr;

Wychodzimy z psql'a i wylogowujemy się z konta postgres:

\q
exit

Teraz czas na zmianę ustawień logowania. Jeśli pominiemy ten krok, mogą pojawić się problemy z logowaniem np do phpPgAdmina. Edytujemy stosowny plik konfiguracyjny serwera:

vim /var/lib/pgsql/data/pg_hba.conf

Tip: Przed wprowadzeniem zmian w pliku warto wykonać jego kopię zapasową.

Na końcu pliku znajduje się taka oto niby tabelka:

# TYPE  DATABASE    USER    CIDR-ADDRESS   METHOD

# "local" is for Unix domain socket connections only
local all all ident sameuser
# IPv4 local connections:
host all all 127.0.0.1/32 ident sameuser
# IPv6 local connections:
host all all ::1/128 ident sameuser

Aby wszystko grało jak należy, musimy zmienić zawartość ostatniej kolumny (METHOD) z ident sameuser na md5. Podmieniamy wartości we wszystkich trzech wierszach, otrzymując:

# TYPE  DATABASE    USER    CIDR-ADDRESS   METHOD

# "local" is for Unix domain socket connections only
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5

Zapisujemy wszystkie zmiany z pliku i restartujemy serwer.

/etc/init.d/postgresql restart

Teraz można zalogować się do phpPgAdmina.

Na zakończenie dzisiejszego artykułu wspomnę jeszcze tylko o jednej (istotnej m.in. dla użytkowników MediaWiki) sprawie związanej z instalacją różnego rodzaju oskryptowania wykorzystującego bazy PostgreSQL. Czasami może występować błąd w instalacji i skrypt może wypluć dziwny dla niektórych błąd związany z tsearch2 (skrypt wymaga zaimplementowanej funkcjonalności pełnego indeksowania tekstu). Ja takowy problem napotkałem w czasie instalacji właśnie MediaWiki na localu. Należy wówczas odpalić terminal, przejść do katalogu /usr/share/pgsql/contrib i upewnić się czy istnieje tam plik tsearch2.sql (jeśli nie, trzeba dociągnąć yumem pakiet postgres-[wersja]-contrib - gdzie [wersja] to oczywiście nasza wersja Postgresa). Następnie logujemy się na swojego usera i ładujemy wspomniany plik do bazy, w której chcemy zainstalować MediaWiki:

psql [nazwa_bazy_dla_wiki] < tsearch2.sql

Psql poprosi nas o hasło. Wpisujemy je i ponawiamy próbę instalacji.

Kolejne kilka postów poświęcę na zabawy z domenami. Następnym razem zobaczymy jak tanio zarejestrować nową domenę i gdzie ją wydelegować, aby... wykorzystać do granic możliwości. Czekajcie cierpliwie ;D

Zauważyłeś błąd w artykule? Coś nie działa? Zostaw swoje uwagi w komentarzach.

czwartek, 7 lutego 2008

Lepszy Apache - wprowadzamy małe zmiany w httpd.conf - #2 vHosty

Witam w drugiej części mojego małego tutorialu dotyczącego modyfikacji httpd.conf :) Trochę wody w rzece upłynęło od ostatniego artykułu, ale wiadomo co było tego powodem: standardowo brak czasu, zajęcia o wyższym priorytecie, odrobinka lenistwa, no i oczywiście sesja ;p Ale do rzeczy. Poprzednio pisałem o tym jak wpuścić Apache'a do katalogów userów przy pomocy userdir_module. Dzisiaj część druga mojego wywodu.

Czymże są wirtualne hosty (vhost)? Tak najprościej mówiąc, vhosty dają nam możliwość utrzymywania na jednej maszynie wielu niezależnych domen. Na nich opiera się praktycznie cały hosting tego świata - wirtualny oczywiście. Dzięki nim Onet i Nasza-klasa mogą stać na jednym serwerze ;) Pokrótce - na czym to wszystko polega? Idea jest prosta: parkujemy domenę na serwerze i podpinamy ją pod swój public_html, uzyskując tym samym dostęp do niego za pomocą fajnego www.mojsexiadresik.pl, a nie paskudnego www.okropnyadresmojegoprovidera.com.pl/~mojasexistronka/ ;p Kwestię parkowania domeny sobie tutaj pominiemy i zajmiemy się tylko podpięciem jej pod wybrany katalog. No dobra, ale ktoś zapyta jak podpiąć domenę, której nie ma? Słuszna uwaga. Cały problem ominiemy poprzez wykorzystanie fikcyjnej domeny i wymuszenia na Fedorze przekierowania jej na localhost. Już mówię jak to zrobić, sprawa jest na prawdę banalna.

Po pierwsze - trzeba włączyć na Apache'u mod UserDir (tutorial). Będę opisywał wszystko na przykładowej, utworzonej w ostatnim artykule stronie http://localhost/~sdr/, więc kto nie czytał powinien nadrobić zaległości (a arty miały być niezależne od siebie ;D).

Jeżeli wszystko działa jak należy i po wpisaniu w przeglądarce powyższego adresu naszym oczom ukazuje się wielkie Hello world!, możemy przystąpić do edycji pliku konfiguracyjnego. Logujemy się na roota i otwieramy plik.

vim /etc/httpd/conf/httpd.conf

Około linii 180 odszukujemy coś co nazywa się

LoadModule vhost_alias_module modules/mod_vhost_alias.so

Linia nie powinna być zahaszowana, ale jeśli jest inaczej, usuwamy sprzed niej znak #. Następnie przechodzimy w okolice linii 954, gdzie rozpoczyna się sekcja konfiguracji vhostów. Kilka linii niżej zobaczyć można pierwszy z dwóch interesujących nas tutaj fragmentów.

# Use name-based virtual hosting.

Bezpośrednio pod nim umieszczamy dodatkową linijkę.

NameVirtualHost 127.0.0.2:80

Należy zwrócić szczególną uwagę na podany IP pętli zwrotnej (localhosta). Nie wpisujemy 127.0.0.1 (jak to standardowo czynimy w celu uzyskania dostępu do bieżącego komputera), ale 127.0.0.2 - to ważne. Jeszcze nie wiem dlaczego, ale kiedy wpisywałem u siebie jedynkę, miałem potem różne śmieszne problemy.

Tip: Od razu zaznaczę, że dla każdego kolejnego vhosta przyporządkowuje się następny numerek w ostatnim oktecie adresu. Ważne, aby wszytkie vhosty były kierowane na inne adresy (127.0.0.2, 127.0.0.3, itd). Konieczne jest też dodanie po adresie numeru portu. Zawsze wpisujemy domyślny 80. Kolejne adresy można dopisywać jeden pod drugim.

Teraz przechodzimy jeszcze niżej. Zapewne w oczy rzuca się Wam przykładowy blok konfiguracyjny vhosta.

#<VirtualHost *:80>
# ServerAdmin webmaster@dummy-host.example.com
# DocumentRoot /www/docs/dummy-host.example.com
# ServerName dummy-host.example.com
# ErrorLog logs/dummy-host.example.com-error_log
# CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>

Do takiego bloku jak widać można wpisać trochę różnych dyrektyw. Nam jednak na własne potrzeby wystarczą tylko te najważniejsze.

<VirtualHost 127.0.0.2:80>
ServerAdmin webmaster@sdr.lh
DocumentRoot /home/sdr/public_html
ServerName sdr.lh
ServerAlias *.sdr.lh
</VirtualHost>

ServerAdmin to adres e-mail admina serwera. W sumie można tu wpisać taki adres jaki tylko chcemy. Będzie on wyświetlany np na stronach błędów serwera.
DocumentRoot definiuje ścieżkę dostępu do katalogu, pod który chcemy podpiąć naszą domenkę.
ServerName - tutaj podajemy nazwę podpinanej domeny (bez żadnych gadżetów typu www czy http:// oczywiście ;]). Również tutaj wpisać możemy co nam się tylko spodoba, nawet bardzolubie.mojastronke ;p Możemy, bo tak jak wcześniej zaznaczyłem będziemy używać tego jedynie dla siebie. Jednak, aby nie przeginać zbytnio, wykorzystujemy tradycyjną domenę najwyższego poziomu (TLD), 2-literową. Najlepiej skorzystać z nieistniejącej domeny, ale o tym później. Ja wykorzystuję .lh - skrót od localhost.
ServerAlias to bardzo fajna opcja, która stosunkowo często przydaje się w prawdziwej sieci. Pełni ona rolę drugiej nazwy, ale częściej chyba jest wykorzystywana do uaktywniania tzw. wildcarda (krótko mówiąc, nakazuje serwerowi wychwytywać wszystkie nieistniejące subdomeny i przekierowywać żądania do domeny głównej - coś Wam to mówi? Taaak, aliasy www ;D).
ErrorLog i CustomLog służą odpowiednio do logowania w plikach dziennika błędów i każdej próby dostępu do jakiegokolwiek pliku na serwerze. Te dyrektywy pozwalają nam ustalić miejsce, w którym wszystko będzie się zapisywało.

Zapisujemy zmiany w pliku httpd.conf i restartujemy serwer. Gdy Apache wróci do siebie, otwieramy do edycji drugi plik.

vim /etc/hosts

To ważny plik systemowy, w którym zapisywane są na sztywno nazwy hosta i przypisane im adresy IP. Domyślnie znajduje się tam tylko jeden host - właśnie pętla zwrotna - gdyż cała reszta świata jest odsługiwana dynamicznie poprzez serwery DNS, tak? Plik powinien zawierać mniej więcej coś takiego:

# Do not remove the following line, or various programs
# that require network functionality will fail.
::1 localhost.localdomain localhost

Tip: Na samej górze zawarte jest bardzo istotne ostrzeżenie odnośnie usuwania umieszczonej w pliku domyślnej linii. Naprawdę, nie polecam. Możecie się zdziwić jak wiele od niej zależy :)

W każdym bądź razie, pierwsza linia za bardzo nas nie intersuje. My dopisujemy się pod spodem.
127.0.0.2 sdr.lh www.sdr.lh blog.sdr.lh


Każdy taki wpis (linia) jest zbudowany zasadniczo z trzech kolumn tekstu, oddzielonych od siebie znakami tabulatora. Pierwsza linia to IP, na który zostanie przekierowany ruch. Druga kolumna do nazwa domeny. Trzecia (i każda kolejna po tabulatorze) to alias dla nazwy domeny. Tutaj niestety nie działa gwiazdka (wildcard) i każda subdomena extra, która ma zostać przekierowana musi zostać wpisana na sztywno. Dobrze chociaż, że DNS nie ma takich problemów ;> Kiedy skończysz edycję pliku, zapisz zmiany i zamknij go.

Teraz można wykonać próbę. Wpisz do paska adresu przeglądarki sdr.lh, www.sdr.lh lub blog.sdr.lh. W każdym z przypadków powinieneś zobaczyć stronę Hello world! umieszczoną w swoim katalogu domowym.

Pozostaje jeszcze pytanie, po co vhosty na localu? Ano np po to, żeby móc sprawdzić działanie projektowanej witryny w warunkach rzeczywistych. Jeżeli piszemy CMS dla konkretnej strony dysponującej domeną np sdr.pl, to dużo łatwiej będzie nam się go testowało jeśli będziemy mogli go uruchomić w warunkach podobnych do tych naturalnych, czyli pod adresem sdr.lh zamiast localhost/~sdr/ - nieprawdaż?

No dobra, ale dlaczego nie powinienem używać do testów np domeny .pl? Odpowiedź jest prosta: ponieważ domena, którą sobie wybierzesz, nawet jeśli teraz nie istnieje, kiedyś może zostać zarejestrowana. Wówczas spotka Cię nieprzyjemna niespodzianka - zamiast właściwej strony, zobaczysz swoje Hello world! :) Zresztą możesz to sprawdzić już teraz. Wystarczy, że w pliku /etc/hosts zamiast sdr.lh wpiszesz np onet.pl :> Domena .lh nie istnieje i zapewne już nie powstanie, więc można z niej bezpiecznie korzystać.

Dzisiaj to by było na tyle. W kolejnym artykule, przedstawię instalację baz danych PostgreSQL na Fedorze. Z tym jest trochę trudniej niż z MySQL, ale tylko trochę :) Tymczasem zapraszam do głosowania w nowej ankiecie. Jednocześnie dziękuję za Waszą wiarę w tego bloga, którą potwierdzają wyniki poprzedniej sondy.

Zauważyłeś błąd w artykule? Coś nie działa? Zostaw swoje uwagi w komentarzach.