Konfiguracja serwera cz.3

execZ dośc sporym opóźnieniem, ale za to kolejny pełnowartościowy artykuł na temat podstawowej konfiguracji serwera dedykowanego/VPS.

Dla osób niewtajemniczonych, które nie wiedzą o co chodzi, to polecam zapoznanie się z wpisem „Hosting – transfer i cena„. Obiecałem sobie i czytelnikom, że opublikuję w kilku częściach dokładny opis konfiguracji serwera stron www, przystosowanego do własnych potrzeb.
Dziękuję wszystkim, którzy zostawili komentarz pod drugą częścią tutoriala – dzięki nim sam czegoś więcej się nauczyłem, a także poprawiłem i uzupełniłem poradnik o zgłaszane błędy i sugestie.

Część trzecia poradnika będzie zawierać opis instalacji i konfiguracji serwera Apache, interpretera PHP, bazy danych MySQL, oraz phpmyadmin.

Instalacja i konfiguracja LAMP

Teraz przechodzimy do sedna sprawy – po wstępnej konfiguracji, pora uruchomić serwer stron Apache – dzięki temu nareszcie będziemy widzieć efekty naszej pracy (czyt. instalacji) w postaci namacalnych dowodów – wyświetlających się dynamicznych stron PHP.

Instalacja całego tego oprogramowania nie jest trudna. Sprowadza się raptem do jednego polecania, w którym uwzględnimy wszystkie składniki jakie mają zostać zainstalowane.

# apt-get install apache2 libapache2-mod-auth-mysql mysql-server mysql-client php5 php5-mysql php5-curl php5-gd php5-memcache php5-xsl

Oczywiście przed tą komendą warto zaktualizować swoje repozytorium.

# apt-get update

Podczas procesu instalacji mogą wyskoczyć monity o wybranie odpowiedniej opcji, bądź podanie domyślnego hasła root bazy danych. Myślę, że opis tego jest zbędny, ponieważ jeśli pojawi się takie „okienko”, zawsze dobrze opisane są opcje w nim zawarte.

Gdy wszystko zostanie zainstalowane i skonfigurowane, to po wpisaniu w ulubioną przeglądarkę internetową adresu IP serwera na którym został zainstalowany LAMP zobaczymy stronę podobną do tej:

it-works
(proszę nie łączyć mnie z przeglądarką Internet Explorer! Jest to najgorsza przeglądarka na Świecie, ale z racji że nie korzystałem z niej (nie miałem otwartych stron w kartach) to nadawała się idealnie do zrobienia screena :P)

Jeśli dostaniemy informacje, że nie można połączyć się do zdalnego serwera, to znaczy, że coś przy instalacji poszło nie tak, bądź jest uruchomiony firewall, który ogranicza dostęp do serwera przez port 80. Musicie to rozwiązać na własną rękę, ponieważ nie widzę Waszych błędów i plików konfiguracyjnych, a wiadomo – z pustego nawet BlueMan nie naleje, a szklaną kulę oddałem do naprawy :)

Co spostrzegawczy obserwatorzy zauważyli, że komenda nie uwzględnia instalacji phpMyAdmin. Bez obaw – powrócę do tego w dalszej części poradnika.

Konfiguracja Apache2

Podstawową aplikacją, która będzie przyjmować i obsługiwać ruch internetowy po stronie serwera jest Apache. Nazwa Apache pochodzi od indiańskiego plemienia; jego logo to kolorowe piórko.apache logo

Apache HTTP Server często nazywany po prostu Apache jest obecnie najpopularniejszym serwerem spotykanym w internecie. Serwer Apache był pierwszą alternatywą dla serwera Netscape Communication Corporations (obecnie znanego jako Sun Java System Web Serwer). Aplikacja Apache została stworzona przez Roberta McCool, który pracował na zlecenie National Center for Supercomputing Applications.

Domyślna instalacja Apache jest niczego sobie. Właściwie dla przeciętnego Kowalskiego nie ma co tam zmieniać, jedynie takie liftingujące rzeczy.
Plik konfiguracyjny znajduje się w drzewie: /etc/apache2/apache2.conf

Otwieramy go ulubionym edytorem tekstu i zmieniamy kilka wartości. Jeśli jakiegoś wpisu nie znajdziesz u siebie, to warto rozważyć dodanie go. Pod spisem wszystkim wprowadzonych zmian wyjaśnię co od czego zależy.

ServerName MojaNazwaSerwera
Timeout 30

<IfModule mpm_prefork_module>
StartServers            20
MinSpareServers        15
MaxSpareServers        30
MaxClients            100
MaxRequestsPerChild    1000
</IfModule>
<IfModule mpm_worker_module>
StartServers            10
MaxClients            100
MinSpareThreads        20
MaxSpareThreads        50
ThreadsPerChild        20
MaxRequestsPerChild    1000
</IfModule>ServerSignature Off

  • ServerName – jeśli nie mamy podanej tej wartości, to przy restarcie serwera Apache dostaniemy błąd o tym, choć będzie działać poprawnie.
  • Timeout – ilość sekund, po których dostaniemy informacje, że serwer nie odpowiada.
  • mpm_prefork_module i mpm_worker_module – ilość połączeń, wątków uruchomionych na serwerze zależy przede wszystkim od ilości dostępnego ramu i obciążenia serwera. W/w wartości miałem ustawione na serwerze typu Intel Pentium4 2.66GHz, 1.2GB DDR1 RAM. Przy większych wartościach serwer zachowywał się bardzo niestabilnie – opisywałem swoje problemy na blogu (http://www.blueman.pl/informatyka/id417-apache.html)
  • ServerSignature – włącza/wyłącza wyświetlanie stopki z informacją o serwerze i zainstalowanym oprogramowaniu, m.in. przy stronie błędu pokazuje się ta informacja. Zalecam wyłączyć wyświetlanie takich informacji, aby potencjalny intruz nie wiedział jaką wersje oprogramowania mamy i do jakiej szukać dziur/exploitów.

To jaką konfigurację przyjmiemy zależy od tego jaki ruch będziemy przyjmować przez serwer. Metodą prób i błędów każdy na pewno dojdzie do swojej idealnej konfiguracji. Pamiętajcie, aby wtedy zrobić kopię bezpieczeństwa plików!
Jeśli jakiejś linijki nie potrzebujemy, to lepszym wyjściem jest jej zakomentowanie (znak hash: #), niż wyrzucenie – może kiedyś będziemy chcieli powrócić do starych ustawień?

Po wprowadzonych wszystkich zmianach nie zapomnijcie zrestartować serwer Apache, aby wczytał nowe ustawienia:

# /etc/init.d/apache2 restart

VirtualHost
Teraz, oprócz tego, że serwer stron www Apache funkcjonuje prawidłowo musimy posiąść wiedzę jak i gdzie umieszczać strony. Apache umożliwia przecież utrzymywanie kilku stron.

Główny katalog stron to /var/www/ – to w nim znajduje się plik index.html który zawiera napis „It works!” wyświetlany po wejściu na IP serwera.
Mimo wszystko nie zalecam trzymać stron w tamtym miejscu, ponieważ jest z tym kilka problemów – główny to taki, że przez FTP nie dostaniemy się do katalogu /var/www/, a drugim powodem jest to, że jednak swoje strony warto trzymać w swoim katalogu domowym – w którym znacznie częściej przebywamy, niż w /var/www/ (automatycznie po logowaniu na SSH jesteśmy w katalogu domowym – nic nie musimy zmieniać)

Jeśli mamy domenę internetową to u naszego rejestratora należy przekierować ją na własny adres IP. W dzisiejszych czasach wszyscy rejestratorzy taką opcję udostępniają – nazwa.pl, cal.pl, ovh.pl, itd.

nazwa.pl
przekierowanie-ip-nazwacal.pl
przekierowanie-ip-cal

Przekierowanie domeny na serwer przez IP nie jest eleganckim rozwiązaniem, ale na razie musi nam ta metoda wystarczyć. W kolejnych częściach poradnika umieszczę konfigurację i ustawiania własnego serwera nazw, więc proszę się nie martwić i na razie nie krytykować tego pomysłu ;)

Kiedy już to zrobimy i domena będzie prawidłowo działać, tzn. wyświetlać przyjazny napis „It works!” pora przystąpić do ustawień VirtualHost, aby nasz adres internetowy wskazywał na inny katalog, niż domyślny /var/www/.

/etc/apache2/sites-available/ – tutaj dostępne są wszystkie VirtualHost jakie są na serwerze. Zalecam tutaj tworzyć kolejne pliki, podzielone względem obsługiwanej domeny, a następnie tworzyć linki do /etc/apache2/sites-enabled/ w którym są aktywne/działające strony na serwerze.

Stwórzmy więc VirtualHost, który będzie obsługiwać domenę BlueForum.pl. Pliki znajdują się w /home/blueman/public_html/blueforum.pl/

$ vim /etc/apache2/sites-available/blueforum

<VirtualHost *>
ServerAdmin [email protected]
DocumentRoot /home/blueman/public_html/blueforum.pl/
ServerName blueforum.pl
ServerAlias www.blueforum.pl
ErrorLog /var/log/apache2/blueforum.pl-error_log
CustomLog /var/log/apache2/blueforum.pl-access_log common
</VirtualHost>

  • ServerAdmin – W razie wystąpienia jakiegoś błędu, często Apache wyświetla email administratora. Tutaj możemy ustawić spersonalizowany dla konkretnej domeny.
  • DocumentRoot – ścieżka bezwzględna do katalogu na który ma wskazywać domena. Ścieżka ta musi zostać zakończona sleshem.ServerName – (sub)domena na której serwer ma „słuchać”
  • ServerAlias – jeśli chcemy adres z przedrostkiem www, należy dodać właśnie taką linię do pliku.
  • ErrorLog – plik w którym będą zapisywane błędy, na jakie Apache zwraca uwagę przy korzystaniu z domeny. Pojawiają się tutaj błędy o braku jakiegoś pliku, jeśli zgłoszenie o taki plik nastąpiło
  • CustomLog – zapisuje IP i czynności wszystkich odwiedzających stronę

Należy kontrolować co jakiś czas pliki logów, ponieważ przy popularnej witrynie w bardzo szybkim tępię mogą urosnąć do bardzo dużych rozmiarów.

Jeśli plik jest już gotowy, należy go podlinkować w katalogu sites-enabled

# ln -s /etc/apache2/sites-available/blueforum /etc/apache2/sites-enabled/blueforum

Polecenie to jest oczywiście jedną linijką, a nie dwoma.

Przed przeładowanie serwera Apache należy utworzyć katalog który podaliśmy przy konfiguracji VirtualHost dla domeny.

$ mkdir /home/blueman/public_html/blueforum.pl

Teraz wystarczy restart serwera i gotowe:

blueman@bluebudg:/etc/apache2$ sudo /etc/init.d/apache2 restart
Forcing reload of web server (apache2)… waiting .

Wpisując w przeglądarkę adres www.BlueForum.pl zobaczymy pliki umieszczone w /home/blueman/public_html/blueforum.pl/ a nie tak jak poprzednio (domyślnie) /var/www/.

Subdomeny tworzymy identycznie. Kompletnie niczym to się nie różni.

<VirtualHost *>
ServerAdmin [email protected]
DocumentRoot /home/blueman/public_html/forumorange.net/artykuly/
ServerName artykuly.forumorange.net
ServerAlias www.artykuly.forumorange.net
ErrorLog /var/log/apache2/forumorange.net.artykuly-error_log
CustomLog /var/log/apache2/forumorange.net.artykuly-access_log common
</VirtualHost>

Pamiętajcie przede wszystkim o tym, aby przy każdej zmianie zrestartować serwer.

Konfiguracja PHP5

Kolejnym składnikiem serwera internetowego jest interpreter PHP, który odpowiada za przetwarzanie plików PHP aplikacji serwisu. Dzięki niemu mamy możliwość tworzenia, dynamicznych stron internetowych.

php5-logoNazwa ta jest rekursywnym akronimem słowa PHP Hypertext Preprocessor. PHP jest skryptowym językiem programowania stworzony do generowania dynamicznych stron www. Jest językiem, który działa po stronie serwera, ale również może zostać wywoływany z linii poleceń systemowych.

Pierwotnie PHP został stworzony w 1995 roku przez Rosmusa Lerdorfa, a obecnie jest rozwijany przez PHP Group.
Lerdorf zaczął tworzyć swój projekt „Personal Home Page Tools”, ponieważ szukał alternatywy do języka Perl, którego używał na swojej domowej stronie internetowej. Potrzebował nowych funkcjonalności do wyświetlania swojego curriculum vitae, oraz analizowania ile ruchu (ściągnięć, itp.) generuje jego strona oraz samo CV. Tworząc PHP zaimplementował dużą ilość bibliotek napisanych w języku C, dzięki którym była możliwość komunikacji z bazami danych dostępnymi na serwerze. Rosmus zdecydował się 8 czerwca 1995 udostępnić swoje dzieło, aby przyśpieszyć znajdowanie luk bezpieczeństwa i poprawę kodu, wykorzystując do tego pomoc innych internautów. Wydanie to zostało nazwane wersją PHP2 i posiada swoją podstawową funkcjonalność po dzień dzisiejszy. Składnia nowego języka podobna jest do Perla – posiada zmienne, możliwość umieszczania kodu HTML. Ale mimo podobieństwa do języka Perl, PHP jest bardziej ograniczony i prostszy.

Także i w tym wypadku domyślny plik konfiguracyjny jest niemal bezbłędny. PHP to tylko interpreter, a to jak szybko będzie działać zależy przecież od programisty, który pisze stronę www – na nim spoczywa odpowiedzialność za wydajność witryny.

Plik php.ini znajduje się w prostej do zapamiętania lokalizacji:
/etc/php5/apache2/php.ini

Tak jak w przypadku Apache (a także każdego innego oprogramowania) – polecam komentowanie, i w ten sposób zostawianie starych linijek konfiguracji, niż ich zastępowanie. Jeśli coś pójdzie nie tak będziemy mogli łatwo wrócić do poprawnej, działającej wersji.

max_execution_time = 60
memory_limit = 128M
upload_max_filesize = 50M

  • max_execution_time – ilość czasu w sekundach, przez jaką skrypt maksymalnie może się wykonywać.
  • memory_limit – wielkość pamięci RAM z jakiej PHP może korzystać. Przy operacji (odczycie/tworzeniu) dużych plików warto ustawić wysoką wartość. Nie zalecam wartości poniżej 10MB
  • uploat_max_filesize – maksymalna wartość jaką możemy przesłać przez formularz. Dzięki temu także w phpmyadmin będziemy mogli uploadować duże bazy danych.

Jak widzicie dużo do zmiany nie było, i wcale nie wpływają one na zwiększenie wydajności aplikacji internetowych.
Jak już wszystkie zmiany wykonamy, to pozostaje tylko zrestartować serwer

# /etc/init.d/apache2 restart

Jeśli restart serwera nastąpił bez błędów, a mimo wszystko mamy wątpliwości, czy wartości wpisane w PHP są prawidłowo zapisane stwórzmy plik phpinfo.php, umieśćmy go w /var/www/, a w nim wpiszmy:

<?php
phpinfo();
?>

Jeśli w przeglądarce wpiszemy http://ip.serwera/phpinfo.php to powinniśmy zobaczyć stronę z wszystkimi opcjami jakie są ustawione w serwerze, bazie danych oraz interpreterze PHP.

php-info

Konfiguracja MySQL
Można powiedzieć, że temat rzeka. Istnieje tak dużo opcji konfiguracyjnych serwera baz danych, że nie sposób je wszystkie wymienić, a tym bardziej nauczyć się dobierać odpowiednie ich parametry. Trzeba mieć naprawdę porządne doświadczenie w tej sprawie, aby to ogarnąć.

Początkowo w mojej historii z serwerami www, znajomy optymalizował mi serwer bazy danych. Potem sam próbowałem zmieniać wartości (po dołożeniu pamięci ram), ale niestety zakończały się one fiaskiem i baza danych działała jeszcze wolniej.

Jeśli chodzi o optymalizację MySQL, to naprawdę warto poświęcić kilka dni/tygodni na to, ponieważ daje to bardzo porządne efekty.

Domyślny plik /etc/mysql/my.cnf można śmiało wyrzucić do kosza i zbudować swój własny.
Mój plik /etc/mysql/my.cnf wygląda następująco:

[mysqld]

tmpdir = /tmp
set-variable = max_connections=30
max_user_connections=24
safe-show-database
#skip-locking
skip-innodb
skip-external-locking
key_buffer = 16M
sort_buffer_size = 64M
record_buffer = 32M
table_cache = 2000
thread_cache_size = 256
tmp_table_size = 190M   #128M
read_rnd_buffer_size = 768K
read_buffer_size = 8M
max_allowed_packet = 16M
query_cache_limit = 8M
query_cache_size = 35M
query_cache_type = 1
thread_concurrency = 4
default-character-set = utf8

# dodano po optymalizacji
join_buffer_size = 256K
max_heap_table_size = 50M
log-slow-queries = /var/log/mysql-slow-queries.log
long_query_time = 5
open_files_limit = 5000

!includedir /etc/mysql/conf.d/

Oczywiście każdy musi własne wartości dobrać – względem tego jaki sprzęt ma w serwerze, oraz ile odwiedzin mają jego wszystkie strony korzystające z bazy danych.

Jak wspomniałem wcześniej – moje wcześniejsze próby samodzielnego eksperymentowania w dobierania odpowiednich wartości zakańczały się fiaskiem. Dlatego teraz – w celu poprawnej optymalizacji, korzystam z gotowego oprogramowania, które wspomaga mnie w podejmowaniu decyzji dobór odpowiedniej konfiguracji. Są dwa narzędzia do tego – mysqltunner.com oraz tuning-primer.

Pierwsze uboższe w możliwości, ale podaje bardziej przejrzyste wyniki. Nie sugeruje konkretnych wartości, a tylko przedziały.

Drugie to właściwie kombajn. Właśnie dzięki niemu zawdzięczam to, że serwer bazy danych chodzi stabilnie, a strony wczytują się błyskawicznie.

Po uruchomieniu obydwu z narzędzi będziemy proszeni o podanie loginu i hasła użytkownika bazy danych. Kiedy już to uzupełnimy nastąpi proces analizy użytkowanej bazy danych. Zbieranie informacji nie trwa długo, ale serwer musi być uruchomiony od co najmniej 48 godzin, aby wyniki analizy były sensowne.

Trzeba teraz przeanalizować zasugerowane wartości i wprowadzić odpowiednie poprawki do pliku /etc/mysql/my.cnf.
Po wszystkich zmianach należy zrestartować serwer

# /etc/init.d/mysql restart

Odczekać kolejne ~48 godzin i ponownie sprawdzić wyniki testów uzyskanych przez te programy.

phpMyAdmin

http://www.phpmyadmin.net/ Oprogramowanie to jest znane przez każdego programistę PHP. Dzięki niemu w prosty sposób możemy wykonywać wszystkie operacje na bazie danych.

Nie musimy mieć uprawnień administratora systemu, aby móc korzystać z tego skryptu. Jest to najzwyczajniejszy w życiu skrypt PHP. Często ściągam go i uploaduje na serwer klienta, jeśli nie udostępnia on mi go, lub po prostu zapomniałem poprosić o dostęp do niego, a akurat na konkretny wieczór zaplanowałem wdrażanie aplikacji.

W systemie Debian można w bardzo prosty zainstalować phpMyAdmin poprzez jedno polecenie.

# apt-get install phpmyadmin

I dostęp do niego mamy jako strona mieszcząca się pod adresem http://ip.serwera/phpmyadmin/

I właściwie nic więcej nie musimy robić, aby działało to dobrze. Jednak bardziej spostrzegawczy programiści zauważą, że udostępniana w repozytorium wersja skryptu nie należy do najnowszych. Dlatego ja wybieram zwykle instalacje na własną rękę, która jest równie banalna jak przez repozytorium.

Przechodzę do katalogu /var/www
Ściągam ze strony paczkę z najnowszą stabilną wersją skryptu

$ wget http://dfn.dl.sourceforge.net/sourceforge/phpmyadmin/phpMyAdmin-3.1.3.1-all-languages.zip

Rozpakowywuję ją i zmieniam nazwę folderu.

$ unzip phpMyAdmin-3.1.3.1-all-languages.zip
$ mv phpMyAdmin-3.1.3.1-all-languages phpmyadmin

I tyle :] Bez żadnej dodatkowej konfiguracji phpMyAdmin działa tak samo jak przy instalacji z pakietów repozytorium. A w ten sposób mogę bardzo łatwo i na własną rękę zaktualizować skrypt do nowszej wersji.

W tej części kursu to by było na tyle. Zachęcam do konstruktywnej krytyki tej lekcji :) I zapraszam do kolejnej lekcji – „Mały kurs bind’a – czyli własne serwery nazw
pdf icon bigPodstawowa konfiguracja serwera dedykowanego/VPS