Serwer www - Apache - część 2

Wprowadzenie teoretyczne do lekcji nr 9a

W drugiej części zagadnienia związanego z konfiguracją serwera apache wdrożymy sobie (jak już wcześniej pisałem) w miarę "profesjonalne" rozwiązanie. Skonfigurujemy sobie aż trzy strony WWW:
- www.mydomain.local - taka typowa strona internetowa
- webmail.mydomain.local - możliwe, że wykorzystamy ją sobie w innych zagadnieniach
- serwer.mydomain.local - strona internetowa dostępna pod numerem portu 8080

I. Konfiguracja serwera Apache.

1. Status i konfiguracja serwera Apache.
Aby właściwie wykonać poniższe ćwiczenie należy przywrócić sobie ustawienia domyślne serwera apache. Zmieniamy zatem katalog strony www na ten domyślny oraz przywracamy pracę na porcie numer 80. Myślę, że są to czynności, które każdy powienien już wykonać bez większych problemów.

Zakładam, że pracujemy już na serwerze, który ma początkową konfigurację, taką jak "świeżo po instalacji". Na początek warto sprawdzić status naszego serwera Apache wpisując komendę:
$ sudo systemctl status apache2
Jest ok, choć widać ostrzeżenie, które informuje nas, że Apache nie wie jaka jest pełna nazwa domenowa serwera. Postaramy się zmienić to już teraz.

W tym celu musimy edytować plik /etc/apache2/apache2.conf poleceniem:
$ sudo nano /etc/apache2/apache2.conf
Odnajdujemy sekcję widoczną na screenie i dopisujemy: ServerName webserver1.mydomain.local (taka przykładowa). Nie musimy się zbytnio przejmować tym, że subdomena nie istnieje. To nie ma znaczenia. Apache będzie pod nią widział sam siebie i tylko to się liczy.

Ustawimy sobie również serwer tak, aby nasłuchiwał dodatkowo na porcie 8080. Przyda nam się to później. "Nasłuchiwał" oznacza, że serwer ma korzystać z tego portu – brzydko mówiąc. Edytujemy plik /etc/apache2/ports.conf, poleceniem:
$ sudo nano /etc/apache2/ports.conf
I pod Listen 80 dopisujemy Listen 8080, a następnie zapisujemy plik.

Teraz musimy przetestować konfigurację czy aby na pewno dobrze zapisaliśmy plik. W tym celu musimy wpisać komendę:
$ sudo apache2ctl configtest
Jeżeli uzyskamy rezultat Syntax OK, to oznacza, że wszystko wprowadziliśmy poprawnie. Jeżeli nie to musimy sprawdzić ponownie pliki i znaleźć błąd. Teraz pozostaje nam już tylko zrestartować serwer apache, a później można sprawdzić jego status. Stosujemy znane już polecenia:
$ sudo systemctl restart apache2
$ sudo systemctl status apache2
I jak się okazuje nie ma ostrzeżenia.

Tak profilaktycznie, na przyszłość możemy również dodać odpowiednie reguły do firewalla Ubuntu. Chcemy otworzyć port 80 i 8080 dla TCP. Wpisujemy więc dwie komendy:
$ sudo ufw allow 80/tcp
$ sudo ufw allow 8080/tcp
Firewall odblokuje nam te porty i poinformuje nas o tym. My dodatkowo używając polecenia:
$ sudo ufw status numbered
Sami możemy się o tym przekonać, że te dwa porty są odblokowane.

Właściwie to już teraz wpisując na kliencie serwer.mydomain.local, w przeglądarce możemy sprawdzić czy serwer Apache działa poprawnie. Powinna się wyświetlić strona domyślna, jak na screenie powyżej.

2. Konfiguracja trzech stron na serwerze Apache.
Teraz dopiero zaczyna się zabawa – jak już wcześniej wspominałem skonfigurujemy sobie aż trzy strony WWW. Jedna będzie znajdować się pod adresem www.mydomain.local i będzie to taka typowa strona internetowa. Druga strona będzie dostępna pod adresem webmail.mydomain.local i wykorzystamy sobie ją nieco później, w innym dokumencie. Zaś ostatnia strona to będzie serwer.mydomain.local, ale ta będzie właśnie działać na porcie 8080.
Najpierw zaczniemy od stworzenia odpowiedniej struktury katalogów. Najlepiej to zrobić w katalogu /var/www – domyślnym katalogu apache. Stworzymy trzy foldery, których nazwy będą odpowiadać domenom, prócz ostatniego folderu, który otrzyma nazwę phpmyadmin_serwer.mydomain.local (jest to tymczasowe rozwiązanie). Później w tych folderach stworzymy folder public_html, który będzie zawierał już pliki naszej strony. Czemu tak? Otóż tak często się robi w przypadku publicznych hostingów.

W celu ułatwienia sobie tego zadania, warto przejść najpierw do katalogu /var/www poleceniem:
$ cd /var/www
Później zmodyfikujemy również prawa i właściciela dla tego katalogu i podkatalogów. Do utworzenia katalogów, użyjemy zatem następujących poleceń:
$ sudo mkdir -p www.mydomain.local/public_html
$ sudo mkdir -p webmail.mydomain.local/public_html
$ sudo mkdir -p phpmyadmin_serwer.mydomain.local/public_html
Na koniec pozostała nam już tylko zmiana właścicieli oraz uprawnień. Zastosujemy zatem polecenia:
$ sudo chown www-data:www-data -R /var/www
$ sudo chmod 775 -R /var/www
Pozostało nam już tylko wyświetlenie zawartości folderu /var/www. Widzimy, że wszystko się zgadza. Tak na marginesie dodam tylko, że jeśli ktoś chciałby sobie sprawdzić domyślnego właściciela i grupę serwera apache, to informacja taka znajduje się w pliku /etc/apache2/envvars.conf

Teraz dla strony www.mydomain.local, utworzymy sobie prosty plik o nazwie index.html, w którym będzie umieszczona zawartość naszej strony – czemu index? Tak się przyjęło, że domyślnie kiedy nie jest sprecyzowany w zapytaniu konkretny zasób, to serwer WWW zwraca plik index, np. index.html czy index.php. Plik ten tworzymy oczywiście w folderze public_html dla domeny www.mydomain.local. Oczywiście nie wymagam od was znajomości HTML-a (nie ten przedmiot). Podobnie jak w poprzedniej lekcji wystarczy przepisać kod ze screena, z tekstem mówiącym o korzystaniu z odpowiedniej domeny.

3. Wyłączenie strony domyślnej i tworzenie plików konfiguracyjnych.
Można powiedzieć, że doszliśmy wreszcie do momentu, w którym zacznie się coś dziać. Na początku wyłączamy domyślną stronę apache. Można to zrobić komendą:
$ sudo a2dissite 000-default
Teraz w katalogu /etc/apache2/sites-available, tworzymy plik który będzie nosił nazwę <nasza domena>.conf, np. www.mydomain.local.conf, albo webmail.mydomain.local.conf. W tych plikach zapiszemy sobie konfigurację konkretnej strony. Krótko wyjaśnię jak powinna wyglądać zawartość takiego pliku konfiguracyjnego. Najpierw zaczynamy od napisania <VirtualHost *:80>, który informuje apache, że w tym momencie zaczyna się definicja wirtualnego hosta, czyli jednej konkretnej strony internetowej – wirtualnej i dotyczy ona każdego adresu IP serwera (ta gwiazdka), ale tylko na porcie 80. Otóż Apache zamiast jednej strony pozwala hostować wiele stron oddzielonych od siebie, właśnie za pomocą virtual hostów. Przechodzimy do następnej linii i piszemy: ServerName <domena>, podajemy tutaj oczywiście naszą domenę np. www.mydomain.local. Informujemy wtedy apache, że ten virtual host ma się znajdować pod tą domeną, a nie inną. Możemy również napisać ServerAlias <domeny oddzielone spacją>, jeżeli chcemy podać inne domeny, które mają przekierowywać na tą podaną w ServerName. Później ważnym parametrem jest DocumentRoot <ścieżka do katalogu>, gdzie podajemy ścieżkę do folderu, w którym znajdują się pliki strony. W naszym przypadku będzie to /var/www/www.mydomain.local/public_html. Ważne jest jeszcze, aby podać lokalizację pliku z logami, z błędami oraz z innymi wpisami. Zrobimy to za pomocą parametrów ErrorLog <ścieżka> oraz CustomLog <ścieżka> combined. Tam gdzie jest ścieżka utarło się, że podajemy /var/log/apache2/<domena>.log. Na sam koniec musimy zamknąć definicję <VirtualHost *:80> pisząc </VirtualHost>.
Problem jest taki, że nasłuchując na obu portach, a definiując tylko jeden apache zacznie robić pewne anomalie i nagle okaże się, że wszystkie strony są dostępne na obu portach, ale na każdym wyświetlają coś innego. Aby to naprawić należy również zdefiniować virtual hosty dla drugiego portu. W przypadku domen www oraz webmail będzie to port 8080, a w przypadku serwer, będzie to 80. Piszemy więc to co poprzednio tyle, że zamieniamy w <VirtualHost *:80> port 80 na 8080 (lub 8080 na 80, w zależności od domeny). Następnie gdzieś w tej definicji np. pod DocumentRoot piszemy:
<Directory ścieżka do plików strony>
Require all denied
</Directory>

Powie to serwerowi apache, że dla innego portu ma po prostu wyrzucić błąd 403, czyli zabroniono dostępu do zasobu. Jeżeli się pogubiliście to konfigurację dla wszystkich trzech domen prezentuję na screenach poniżej. Na górze edytora nano, macie podaną nazwę pliku.

Wyłączamy zatem naszą domyślną stronę serwera apache poleceniem:
$ sudo a2dissite 000-default
A następnie przechodzimy do katalogu /etc/apache2/sites-available i tworzymy w nim nasz plik:
$ cd /etc/apache2/sites-available
$ sudo nano www.mydomain.local.conf
Wprowadzamy do tego pliku taką zawartość jak wyżej i zapisujemy zmiany w pliku.

Podobne czynności wykonujemy dla dwóch pozostałych naszych domen. W tym samym katalogu tworzymy kolejny plik:
$ sudo nano webmail.mydomain.local.conf
Następnie wprowadzamy do tego pliku taką zawartość jak powyżej i zapisujemy zmiany w pliku.

Pozostała nam już ostatnia domena, więc w tym samym katalogu tworzymy kolejny plik:
$ sudo nano serwer.mydomain.local.conf
I wprowadzamy do tego pliku taką zawartość jak powyżej. Oczywiście na końcu zapisujemy zmiany w pliku.

Teraz musimy tylko odblokować i uruchomić nasze strony. Zrobimy to komendą:
$ sudo a2ensite <adres strony>
Wpisujemy więc po kolei te polecenia:
$ sudo a2ensite www.mydomain.local
$ sudo a2ensite webmail.mydomain.local
$ sudo a2ensite serwer.mydomain.local
Po każdym poleceniu, powinniśmy uzyskać komunikat o włączeniu domen. U nas zadziałało.

4. Dodanie domen do serwera DNS.
Ale to jeszcze nie koniec. Otóż jak można zauważyć – nie istnieją takie domeny jak "www.mydomain.local" czy "webmail.mydomain.local". Musimy je zatem dodać do serwera DNS! Oczywiście przy wyszukiwaniu do przodu i do tyłu. Dodajemy więc:
- Rekord A wskazujący adres serwera na domenę "www.mydomain.local"
- Rekord A wskazujący adres serwera na domenę "webmail.mydomain.local"
- Modyfikujemy rekord @ A i zmieniamy z adresu pętli zwrotnej na adres serwera
- Rekord PTR wskazujący domenę www na adres serwera
- Rekord PTR wskazujący domenę webmail na adres serwera
- Rekord PTR wskazujący domenę mydomain.local na adres serwera

Najpierw zmodyfikujemy plik odpowiedzialny za strefę przeszukiwania do przodu. Edytujemy zatem odpowiedni plik poleceniem:
$ sudo nano /etc/bind/forward.mydomain.local.db
I wprowadzamy odpowiednie zmiany. NIE ZAPOMINAMY O ZWIĘKSZANIU PARAMETRU SERIAL O 1 ORAZ O KROPKACH W DOMENACH!

Podobnie modyfikujemy plik odpowiedzialny za strefę przeszukiwania do tyłu. Edytujemy zatem odpowiedni plik poleceniem:
$ sudo nano /etc/bind/reverse.mydomain.local.db
I podobnie jak wyżej, wprowadzamy zmiany. NIE ZAPOMINAMY O ZWIĘKSZANIU PARAMETRU SERIAL O 1 ORAZ O KROPKACH W DOMENACH!

Następnie sprawdzamy strefy czy są dobrze zapisane oraz wydajemy komendę przeładowania stref, służy do tego polecenie:
$ sudo rndc reload <domena>
Na samym zaś końcu przeładowujemy serwer Apache. Wszystkie polecenia, które należy wpisać są następujące:
$ sudo named-checkzone mydomain.local /etc/bind/forward.mydomain.local.db
$ sudo named-checkzone 10.168.192.in-addr.arpa /etc/bind/reverse.mydomain.local.db
$ sudo rndc reload mydomain.local
$ sudo rndc reload 10.168.192.in-addr.arpa
$ sudo systemctl reload apache2
Jeśli uzyskamy efekt taki jak na screenie, bez błędów, to znaczy, że skonfigurowaliśmy właściwie nasze pliki.

Musimy jeszcze zmienić katalog główny w pliku /etc/apache2/apache2.conf. Edytujemy go poleceniem:
$ sudo nano /etc/apache2/apache2.conf
I wprowadzamy zmianę widoczną na screenie. Oczywiście zapisujemy zmiany w pliku i jeszcze raz restartujemy serwer apache poleceniem:
$ sudo systemctl restart apache2

Możemy też sprawdzić czy nasz serwer DNS rozpoznaje właściwie nasze nazwy domenowe. Wpisujemy polecenia:
$ sudo nslookup www
$ sudo nslookup webmail
$ sudo nslookup serwer
Wygląda na to, że wszystko jest ok.

Teraz możemy przetestować nasze strony w działaniu z poziomu klienta. Warto też sprawdzić czy nie działają na innych portach np. "www.mydomain.local" na porcie 8080 – tak być nie powinno. Jeżeli się zastanawiacie czemu webmail i serwer coś wyświetlają mimo, że nie ma "index.html", to odpowiedź jest prosta. W domyślnej konfiguracji jeżeli nie ma pliku "indexowego" to Apache wyświetla zawartość folderu (indeksuje katalog). Proste to i oczywiste. Można to zablokować albo poprzez plik ".htaccess" albo w konfiguracji Apache, albo tworząc pusty plik "index.html"

II. Instalacja i testowanie interpretera php.

1. Instalacja interpretera php.
Teraz pora na coś łatwiejszego – otóż do serwera Apache doinstalujemy sobie interpreter PHP, który pozwoli nam wykonywać kod PHP. Są to skrypty, które wykonuje się na serwerze, a rezultat jest przesyłany do użytkownika w formie pliku html – tak więc kod PHP jest niejawny.

Instalacja interpretera php

Aby zainstalować interpreter php musimy zainstalować dwa pakiety: php oraz libapache2-mod-php. Zrobimy to komendą:
$ sudo apt install php libapache2-mod-php
De facto php jest już aktywowany i gotowy do działania.

2. Testowanie interpretera php.
Utwórzmy sobie więc na domenie webmail.mydomain.local, plik index.php i wpiszmy do niego jakieś polecenie. Plik ten umieszczamy w folderze /var/www/webmail.mydomain.local/public_html

Testowanie interpretera php

Aby utworzyć plik index.php, użyjemy standardowego polecenia:
$ sudo nano /var/www/webmail.mydomain.local/public_html/index.php
Wpiszemy do niego polecenie (można przepisać z poniższego screena), które wyświetli nam powyższy tekst na stronie.

Testowanie strony z poziomu klienta

Teraz na kliencie odwiedzamy naszą stronę i jeżeli pojawił się napis "Testujemy interpreter php na domenie WEBMAIL.MYDOMAIN.LOCAL", to oznacza, że:
A) Mamy poprawnie skonfigurowany serwer Apache
B) Mamy poprawnie zainstalowany interpreter PHP
Jeżeli coś nie działa to należy przepatrzeć dokładnie wszystkie pliki.