Serwer WWW to jedna z podstawowych usług spotykanych w administracji systemami i pracy z aplikacjami webowymi. To właśnie on odpowiada za udostępnianie stron internetowych, plików oraz aplikacji w sieci lokalnej lub publicznie w Internecie.
W świecie Linuksa jednym z najczęściej wykorzystywanych rozwiązań tego typu jest Apache HTTP Server, znany po prostu jako Apache lub apache2. To dojrzały, elastyczny i bardzo popularny serwer WWW, który sprawdza się zarówno przy prostych stronach, jak i bardziej rozbudowanych konfiguracjach. Pozwala tworzyć miedzy innymi:
- pojedyncze strony,
- wiele witryn na jednym serwerze,
- osobne porty,
- katalogi użytkowników,
- oraz podstawowe mechanizmy kontroli dostępu.

W tym artykule wykorzystam to samo środowisko laboratoryjne, które było używane wcześniej przy konfiguracji sieci, routingu i DNS. Nie będę tutaj od nowa opisywał konfiguracji interfejsów, tras statycznych czy działania stref DNS, ponieważ te elementy zostały już omówione we wcześniejszych artykułach. Zakładam, że środowisko jest gotowe, routing działa, a hosty potrafią się ze sobą komunikować. Skupimy się natomiast na tym, jak uruchomić Apache, utworzyć własne witryny, obsłużyć różne nazwy i porty oraz ograniczyć dostęp do zasobów.
Na potrzeby tego artykułu:
- Debian będzie pełnił rolę serwera WWW z Apache
- DNS będzie rozwiązywał nazwy wskazujące na Debiana
- CL1 i CL2 będą klientami testującymi dostęp do witryn z dwóch różnych podsieci
- CentOS pozostaje routerem między sieciami
Czym jest Apache i co warto o nim wiedzieć
Apache HTTP Server to jeden z najstarszych i najbardziej znanych serwerów WWW w świecie Linuksa. Jego zadaniem jest odbieranie żądań HTTP lub HTTPS od klientów i zwracanie odpowiednich zasobów, takich jak:
- strony HTML,
- pliki CSS i JavaScript,
- obrazy,
- katalogi z plikami,
- albo dane generowane przez aplikacje.
Największą zaletą Apache jest elastyczność. Można na nim bardzo łatwo:
- uruchomić prostą stronę statyczną,
- hostować kilka stron na jednej maszynie,
- rozdzielić ruch według nazwy hosta,
- uruchomić dodatkowe witryny na innych portach,
- włączyć moduły,
- albo kontrolować dostęp do konkretnych katalogów.
Instalacja Apache
Na Debianie instalacja wygląda bardzo prosto:
apt install apache2
W systemach z rodziny RHEL, takich jak CentOS, odpowiednikiem byłoby:
dnf install httpd
W tym artykule skupiam się jednak na Debianie, bo to właśnie on pełni u nas rolę serwera WWW.
Po instalacji warto od razu sprawdzić status usługi:
systemctl status apache2
Jeśli wszystko zostało zainstalowane poprawnie, usługa powinna być aktywna.
Dobrze też sprawdzić, czy Apache rzeczywiście nasłuchuje na porcie 80:
ss -tlpn | grep :80
Na tym etapie możesz już sprawdzić działanie serwera z poziomu przeglądarki, wpisując adres IP Debiana:
http://172.16.10.1
Jeśli klienci z obu podsieci mają poprawny routing do Debiana, to strona testowa Apache powinna się wyświetlić.

Gdzie znajdują się pliki konfiguracyjne Apache
Po instalacji warto zrozumieć podstawową strukturę konfiguracji Apache w Debianie. Najważniejsze miejsca to:
- /etc/apache2/apache2.conf – główny plik z ustawieniami globalnymi
- /etc/apache2/ports.conf – definicja portów, na których nasłuchuje Apache
- /etc/apache2/sites-available/ – dostępne konfiguracje witryn
- /etc/apache2/sites-enabled/ – konfiguracje witryn aktualnie włączonych
- /etc/apache2/mods-available/ – dostępne moduły
- /etc/apache2/mods-enabled/ – aktualnie włączone moduły
- /var/www/html – domyślny katalog z podstawową stroną
Utworzenie własnej strony WWW
Aby utworzyć własną stronę, najpierw przygotujemy dla niej katalog i prosty plik index.html.
Załóżmy, że chcemy uruchomić witrynę firmową pod nazwą:
www.firma.local
Taka nazwa powinna oczywiście wskazywać w DNS na adres Debiana, więc zakładam, że odpowiedni rekord został już wcześniej dodany w strefie DNS zgodnie z poprzednimi artykułami.
Tworzymy katalog i plik strony:
mkdir /var/www/StronaFirmy
touch /var/www/StronaFirmy/index.html
Do pliku index.html wpisujemy przykładową treść:
<h1>Strona firmowa</h1>
Konfiguracja VirtualHost
Sama zawartość strony nie wystarczy. Trzeba jeszcze poinformować Apache, że ma obsługiwać nową witrynę pod konkretną nazwą.
W tym celu tworzymy nowy plik konfiguracyjny:
mcedit /etc/apache2/sites-available/www.firma.local.conf
Przykładowa konfiguracja może wyglądać tak:
<VirtualHost *:80>
ServerName www.firma.local
DocumentRoot /var/www/StronaFirmy
<Directory /var/www/StronaFirmy>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/www_firma_error.log
CustomLog ${APACHE_LOG_DIR}/www_firma_access.log combined
</VirtualHost>
Co oznaczają te dyrektywy?
- ServerName – nazwa hosta, pod którą witryna ma odpowiadać
- DocumentRoot – katalog z plikami strony
- <Directory … – reguły dostępu do katalogu
- Require all granted – pozwala wszystkim klientom odczytywać stronę
- ErrorLog i CustomLog – osobne logi dla tej witryny
To bardzo dobra praktyka, bo dzięki osobnym logom łatwiej później diagnozować problemy tylko dla jednej strony, zamiast szukać wszystkiego w jednym wspólnym pliku.
Włączenie witryny
Po utworzeniu pliku konfiguracyjnego aktywujemy witrynę:
a2ensite www.firma.local
Spowoduje to utworzenie dowiązania symbolicznego w katalogu:
/etc/apache2/sites-enabled/
Przed restartem warto jeszcze sprawdzić poprawność konfiguracji:
apache2ctl configtest
Jeśli wynik to Syntax OK, można bezpiecznie przeładować usługę:
systemctl restart apache2
Po tej operacji strona powinna być dostępna z przeglądarki po nazwie:
http://www.firma.local

Dostęp do podkatalogu strony
W katalogu witryny możemy tworzyć kolejne podkatalogi, które będą dostępne jako osobne ścieżki URL.
Na przykład utwórzmy katalog czat:
mkdir /var/www/StronaFirmy/czat
touch /var/www/StronaFirmy/czat/index.html
W pliku index.html możemy umieścić prostą treść:
<h1>Czat firmy</h1>
Po zapisaniu plików podkatalog będzie dostępny pod adresem:
http://www.firma.local/czat
Ten przykład bardzo dobrze pokazuje, że po konfiguracji jednej witryny można łatwo budować dalszą strukturę katalogów.

Dodawanie strony działającej na innym porcie
Apache może obsługiwać nie tylko wiele nazw hostów, ale też wiele portów. To przydatne na przykład wtedy, gdy:
- chcesz uruchomić stronę testową,
- wydzielić panel administracyjny,
- albo pokazać, jak działa usługa HTTP poza portem 80.
Najpierw tworzymy katalog i plik strony:
mkdir /var/www/sklep
touch /var/www/sklep/index.html
Przykładowa zawartość:
<h1>Strona sklepu dzialajaca na porcie 1020</h1>
Następnie tworzymy nową konfigurację:
mcedit /etc/apache2/sites-available/sklep.conf
Przykładowy plik:
<VirtualHost *:1020>
ServerName sklep.firma.local
DocumentRoot /var/www/sklep
<Directory /var/www/sklep>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Aktywujemy witrynę:
a2ensite sklep
Teraz trzeba jeszcze dodać nowy port do pliku ports.conf. Dopisujemy w nim parametr Listen 1020.
/etc/apache2/ports.conf

Potem sprawdzamy składnię i restartujemy usługę:
apache2ctl configtest
systemctl restart apache2
Taka witryna będzie dostępna pod adresem:
http://sklep.firma.local:1020

Udostępnianie stron użytkowników przez userdir
Apache pozwala również użytkownikom systemu publikować własne strony w ich katalogach domowych. To funkcja znana z modułu userdir.
Na początek włączamy moduł:
a2enmod userdir
Tworzymy domyślny katalog strony w /etc/skel, aby nowi użytkownicy dostawali go automatycznie:
mkdir /etc/skel/public_html
touch /etc/skel/public_html/index.html
Restartujemy Apache:
systemctl restart apache2
Następnie tworzymy nowego użytkownika:
adduser krystian
Po utworzeniu konta użytkownik będzie miał własny katalog pod scieżką /home/krystian/public_html.
W pliku index.html można umieścić dowolną treść, a strona użytkownika będzie dostępna pod adresem:
http://www.firma.local/~krystian
Jeśli strona się nie wyświetla, bardzo często problemem są uprawnienia do katalogu domowego użytkownika. W takim przypadku można ustawić:
chmod -R 755 /home/krystian/public_html

Udostępnienie plików przez stronę z uwierzytelnianiem
Apache może też służyć nie tylko do wyświetlania stron HTML, ale również do prostego udostępniania plików.
Załóżmy, że chcemy udostępnić pliki pod nazwą:
pliki.firma.local
Taka nazwa powinna oczywiście wskazywać w DNS na Debiana. Jeśli nie pamietasz jak dodać odpowiedni rekord w bind zachęcam do przeczytania poprzedniego artykułu o DNS.
Tworzymy katalog i kilka plików:
mkdir /var/www/pliki
touch /var/www/pliki/dok1.txt
touch /var/www/pliki/dok2.txt
touch /var/www/pliki/dok3.txt
Tworzymy konfigurację witryny:
mcedit /etc/apache2/sites-available/pliki.firma.local.conf
Przykładowa konfiguracja:
<VirtualHost *:80>
ServerName pliki.firma.local
DocumentRoot /var/www/pliki
<Directory /var/www/pliki>
Options Indexes FollowSymLinks
AllowOverride All
AuthType Basic
AuthName "Strefa plikow"
AuthUserFile /var/www/pliki/.htpasswd
Require valid-user
</Directory>
</VirtualHost>
Aktywujemy witrynę:
a2ensite pliki.firma.local
Tworzymy plik z użytkownikami:
htpasswd -cm /var/www/pliki/.htpasswd krystian
htpasswd -m /var/www/pliki/.htpasswd magdalena
Restartujemy Apache:
systemctl restart apache2
Po wejściu na:
http://pliki.firma.local
Apache powinien poprosić o nazwę użytkownika i hasło. Po zalogowaniu się jako Krystian lub Magdalena powinny zostać wyświetlone pliki.

Ograniczenie dostępu do witryny dla określonego adresu IP
Czasem sama autoryzacja użytkownika nie wystarcza i chcemy dodatkowo ograniczyć dostęp tylko do wybranych adresów IP albo sieci.
Można to zrobić na poziomie Apache, na przykład ograniczając dostęp do katalogu lub całej witryny.
W pliku konfiguracyjnym witryny albo w odpowiednim <Directory> można użyć reguł dostępu, na przykład:
<Directory /var/www/pliki>
Options Indexes FollowSymLinks
AllowOverride All
Require ip 172.16.10.10
</Directory>
Wtedy dostęp do zasobu będzie miał tylko klient o adresie:
172.16.10.10
czyli w naszym środowisku Windows CL1.
Jeśli chcesz dopuścić całą podsieć, możesz użyć:
Require ip 172.16.10.0/24
Po zmianach warto jak zawsze wykonać poniższe polecenia. Dzięki temu od razu wiadomo, czy konfiguracja została zapisana poprawnie.
apache2ctl configtest
systemctl restart apache2