wtorek, 26 maja 2015

[APACHE] Jak stworzyć i skonfigurować VirtualHosta?

TRUE
5013960491570143870
Vhosty do bardzo wygodny mechanizm do pracy z Apachem. Pomijając już nawet zastosowania typowo produkcyjne, są świetnym ułatwieniem podczas tworzenia środowisk testowych dla swoich webowych aplikacji. Zdejmują nam ograniczenie jednego katalogu głównego dla aplikacji pozwalając na tworzenie wielu różnych środowisk w obrębie jednego katalogu głównego. Przydają się też podczas testowania przekierowań modułu rewrite, a także podczas pracy z SSL, gdzie możemy wydzielić sobie oddzielną poddomenę na szyfrowaną zawartość.

W tym krótkim przewodniku opiszę procedurę tworzenia takiego vhosta w oparciu o pliki konfiguracyjne Apache'a na Windowsie. Na Linuxach konfiguracja jest analogiczna, ale różni się kilkoma formalnymi zabiegami.

Czym jest wirtualny host? Vhost jest aliasem nakładanym na dany katalog na serwerze, do którego to katalogu przypisujemy odpowiednią subdomenę, przy czym katalog taki staje się Document Rootem dla tworzonej subdomeny.
Przykładowo, dysponując lokalnym serwererem localhost z ustawionym Document Root na dajmy na to przykładowo:
[code]C:\WWW\[/code]
możemy stworzyć w nim kilka podfolderów, np.:
[code]
C:\WWW\subdomena1
C:\WWW\subdomena2
... itd.
[/code]
i następnie utworzyć vhosty kierujące na te katalogi:
[code]
http://localhost  >>> C:\WWW\
http://subdomena1.localhost >>> C:\WWW\subdomena1\
http://subdomena2.localhost >>> C:\WWW\subdomena2\
... itd.
[/code]
gdzie oczywiście vhostami są tutaj subdomena1.localhost i subdomena2.localhost.

Czego będziemy potrzebować, poza oczywiście zainstalowanym Apachem?
  • dostępu do katalogu systemowego, a więc uprawnień administratora
  • dowolnego edytora tekstowego, może być zwykły systemowy Notepad (od siebie polecam Notepada++ do wszelakich "małych" operacji na plikach tekstowych)

1) hosts - konfiguracja DNS

Pierwsze co musimy zrobić to dostać się do pliku, który robi w systemie za pierwszy odpytywany DNS. W Windowsie plik ten znajdziemy tutaj:
[code]C:\Windows\System32\drivers\etc\hosts[/code]
W Linuxach:
[code]/etc/hosts[/code]
Tutaj mała uwaga: musimy otworzyć go do edycji w trybie administracyjnym, inaczej nie będziemy mieć możliwości zapisania w nim zmian. Aby tego dokonać (w systemach windowsowych), klikamy PPM na edytorze tekstowym jakiego chcemy użyć i wybieramy opcję Uruchom jako administrator.
W unixowych systemach dokonujemy tego przez polecenie sudo.

Otwieramy plik do edycji i naszym oczom pokaże się coś mniej więcej takiego:
[code]
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
# 127.0.0.1       localhost
# ::1             localhost

127.0.0.1       localhost
[/code]

Budowa pliku jest bardzo prosta:
W oddzielnych linijkach podajemy przypisania danych hostów do adresów IP.

Zapis:
[code]127.0.0.1  localhost[/code]
mówi systemowi, że hosta localhost ma on w pierwszej kolejności szukać pod adresem 127.0.0.1, który jest lokalnym adresem naszej maszyny, tzw. loopback-iem. Adres 127.0.0.1 zawsze prowadzi do nas samych. W naszym przypadku prowadzi również do naszego lokalnego serwera. Kolejne adresy podajemy tutaj w oddzielnych linijkach, na zasadzie:
[code]ADRES_IP    host[/code]

Dodajmy więc kilka subdomen:
[code]
127.0.0.1   subdomena1.localhost
127.0.0.1   subdomena2.localhost
[/code]
Mała uwaga: jeśli chcemy wejść na localhosta z www na początku, to również i to musimy uwzględnić w pliku hosts.
Nasz plik hosts może więc przyjąć taką postać:
[code]
....
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
# 127.0.0.1       localhost
# ::1             localhost

127.0.0.1   localhost
127.0.0.1   subdomena1.localhost
127.0.0.1   subdomena2.localhost
127.0.0.1   www.localhost
127.0.0.1   www.subdomena1.localhost
127.0.0.1   www.subdomena2.localhost
[/code]

Zapisujemy plik i kierujemy się w stronę Apacha.
Najpierw oczywiście utwórzmy odpowiednie foldery, do których będziemy kierowali vhosty, np.:
[code]
C:\WWW\subdomena1
C:\WWW\subdomena2
[/code]
Jest to bardzo ważne, aby katalogi istniały, gdyż w przeciwnym wypadku Apache odmówi nam dalszej współpracy, gdy nie znajdzie katalogu na jaki będzie miał kierować ruch.

2) httpd.conf - konfiguracja Apache'a

Teraz możliwe są dwie opcje, zależnie od konfiguracji naszego Apache'a. Możemy mieć właczoną, lub wyłaczoną obsługę vhostów. Domyślnie plik z vhostami nie jest dołączany do konfiguracji Apache'a - jeśli tak jest w naszym przypadku, zmienimy to:
Otwieramy do edycji plik konfiguracyjny Apache'a (ponownie na prawach administracyjnych!):
[code]ścieżka/do/apache2/conf/httpd.conf[/code]
i szukamy linii wyglądającej tak:
[code]Include conf/extra/httpd-vhosts.conf[/code]
Linijka ta odpowiada za dołączenie do konfiguracji pliku z definicjami vhostów.
Jeśli przed słowem Include znajduje się znak komentarza (#) to usuwamy go i zapisujemy plik.
Uwaga: w zależności od wersji i konfiguracji Apache'a plik z definicją v-hostów może posiadać inną nazwę, może go też nie być w ogóle, wtedy definiujemy vhosty bespośrednio w pliku httpd.conf lub apache2.conf!

3) httpd-vhosts.conf - konfiguracja wirtualnych hostów

Jeżeli w naszej instaalcji Apache'a istnieje poniższy plik, to otwieramy go (ponownie z administracyjnymi uprawnieniami):
[code]ścieżka/do/apache2/conf/extra/httpd-vhosts.conf[/code]
Plik powinien wyglądać będzie mniej więcej tak:
[code]
# Virtual Hosts
#
# Required modules: mod_log_config

# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at
# <URL:http://httpd.apache.org/docs/2.4/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "c:/www"
    ServerName localhost
    ServerAlias localhost
    ErrorLog "logs/localhost-error.log"
    CustomLog "logs/localhost-access.log" common
</VirtualHost>
[/code]

Każdy blok <VirtualHost>...</VirtualHost> to definicja oddzielnego vhosta.
Dodajmy więc nasze vhosty, które zdefiniowaliśmy w pliku hosts jako:
[code]
subdomena1.localhost
subdomena2.localhost
[/code]
Zrobimy to, dodając kolejny blok z definicją:
[code]
<VirtualHost *:80>
    ServerAdmin nasz@email.com
    DocumentRoot "c:/www/subdomena1"
    ServerName subdomena1.localhost
    ServerAlias subdomena1.localhost
    ErrorLog "logs/subdomena1-error.log"
    CustomLog "logs/subdomena1-access.log" common
</VirtualHost>
[/code]
I analogiczny blok dla subdomeny2:
[code]
<VirtualHost *:80>
    ServerAdmin nasz@email.com
    DocumentRoot "c:/www/subdomena2"
    ServerName subdomena2.localhost
    ServerAlias subdomena2.localhost
    ErrorLog "logs/subdomena2-error.log"
    CustomLog "logs/subdomena2-access.log" common
</VirtualHost>
[/code]

Każda taka konfiguracja vhosta jak widzimy składa się z kilku podstawowych elementów:

[code]<VirtualHost *:80>[/code]
Definiuje na jakim porcie dla tego hosta ma nasłuchiwać serwer, domyślnie jest to port HTTP 80, czasami 8080.
[code]ServerAdmin nasz@email.com[/code]
Określna adres email admina serwera, możemy tutaj podać cokolwiek
[code]DocumentRoot "c:/www/subdomena2"[/code]
Wskazuje pełną ścieżkę do katalogu głównego na jaki prowadzić będzie adres hosta
[code]ServerName subdomena2.localhost[/code]
Definiuje nazwę hosta, musi odpowiadać wpisowi w pliku hosts
[code]ServerAlias subdomena2.localhost[/code]
Definiuje alias dla hosta, musi odpowiadać wpisowi w pliku hosts
[code]ErrorLog "logs/subdomena2-error.log"[/code]
Ustawia plik z logami błędów na logs/subdomena2-error.log
[code]CustomLog "logs/subdomena2-access.log" common[/code]
Ustawia plik z logami dostępu do hosta na logs/subdomena2-access.log

Tutaj mała uwaga - jeśli chcemy korzystać również z przedrostka www. przy podawaniu nazwy subdomeny, powinniśmy zastosować wildcarda (*) w definicji ServerAlias, tj.:
[code]ServerAlias *.subdomena1.localhost[/code]

Nasz plik finalnie wyglądać będzie więc mniej więcej tak:
[code]
# Virtual Hosts
#
# Required modules: mod_log_config

# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at
# <URL:http://httpd.apache.org/docs/2.4/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "c:/www"
    ServerName localhost
    ServerAlias *.localhost
    ErrorLog "logs/localhost-error.log"
    CustomLog "logs/localhost-access.log" common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin nasz@email.com
    DocumentRoot "c:/www/subdomena1"
    ServerName subdomena1.localhost
    ServerAlias *.subdomena1.localhost
    ErrorLog "logs/subdomena1-error.log"
    CustomLog "logs/subdomena1-access.log" common
</VirtualHost>

I analogiczny blok dla subdomeny2:
<VirtualHost *:80>
    ServerAdmin nasz@email.com
    DocumentRoot "c:/www/subdomena2"
    ServerName subdomena2.localhost
    ServerAlias *.subdomena2.localhost
    ErrorLog "logs/subdomena2-error.log"
    CustomLog "logs/subdomena2-access.log" common
</VirtualHost>
[/code]

Zapisujemy plik.
Poprawność konfiguracji vhostów możemy zweryfikować w konsoli, wpisując:
[code]ścieżka/do/apache2/bin/httpd -S[/code]

Jeśli wszystko jest OK, to restartujemy Apache'a, możemy to zrobić poleceniem:
[code]ścieżka/do/apache2/bin/httpd -k restart[/code]

To wszystko.
Od tej chwili możemy korzystać z naszych wirtualnych hostów pod adresami:
[code]
http://subdomena1.localhost
http://subdomena2.localhost
[/code]

Polecam naprawdę używanie vhostów do pracy nad różnymi aplikacjami.
Jest to bardzo wygodne i efektywne rozwiązanie separujące nam aplikacje, nad którymi pracujemy do oddzielnych od siebie domen. Wymaga to jak widać odrobiny czasu na konfigurację, ale zaręczam, że naprawdę warto pracować w taki właśnie sposób, zamiast robić to na zasadzie:
[code]
http://localhost/aplikacja1
http://localhost/aplikacja2
...itd
[/code]
Uwaga: powyższa konfiguracja została opisana na podstawie przykładowej konfiguracji serwera Apache 2.4.9 x64 pracującego pod systemem Windows. Dla innych wersji Apache'a oraz dla wersji pod systemy unixowe może się ona lekko różnić.

2 komentarze:

  1. Solidnie napisane. Pozdrawiam i liczę na więcej ciekawych artykułów.

    OdpowiedzUsuń
  2. Całkowicie się na tym nie znam ale za to jestem zdania, że bardzo ważną sprawą jest to aby na dzień dzisiejszy mieć fajną stronę internetową. Myślę, że właśnie takie prace zdecydowanie najlepiej jest zlecić firmie https://stronywww.kolobrzeg.pl/ która zna się doskonale na budowaniu stron www.

    OdpowiedzUsuń

Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)

webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji