Konfiguracja serwera Apache w Linuxie – witryny, porty i kontrola dostępu

by Patryk

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

You may also like

Leave a Comment