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:

  1. C:\WWW\

możemy stworzyć w nim kilka podfolderów, np.:

  1. C:\WWW\subdomena1
  2.  
  3. C:\WWW\subdomena2
  4.  
  5. ... itd.
  6.  

i następnie utworzyć vhosty kierujące na te katalogi:

  1. http://localhost  >>> C:\WWW\
  2.  
  3. http://subdomena1.localhost >>> C:\WWW\subdomena1\
  4.  
  5. http://subdomena2.localhost >>> C:\WWW\subdomena2\
  6.  
  7. ... itd.
  8.  

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:

  1. C:\Windows\System32\drivers\etc\hosts

W Linuxach:

  1. /etc/hosts

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:

  1. #      102.54.94.97     rhino.acme.com          # source server
  2.  
  3. #       38.25.63.10     x.acme.com              # x client host
  4.  
  5.  
  6.  
  7. # localhost name resolution is handled within DNS itself.
  8.  
  9. # 127.0.0.1       localhost
  10.  
  11. # ::1             localhost
  12.  
  13.  
  14.  
  15. 127.0.0.1       localhost
  16.  


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

Zapis:

  1. 127.0.0.1  localhost

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:

  1. ADRES_IP    host


Dodajmy więc kilka subdomen:

  1. 127.0.0.1   subdomena1.localhost
  2.  
  3. 127.0.0.1   subdomena2.localhost
  4.  

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ć:

  1. ....
  2.  
  3. #      102.54.94.97     rhino.acme.com          # source server
  4.  
  5. #       38.25.63.10     x.acme.com              # x client host
  6.  
  7.  
  8.  
  9. # localhost name resolution is handled within DNS itself.
  10.  
  11. # 127.0.0.1       localhost
  12.  
  13. # ::1             localhost
  14.  
  15.  
  16.  
  17. 127.0.0.1   localhost
  18.  
  19. 127.0.0.1   subdomena1.localhost
  20.  
  21. 127.0.0.1   subdomena2.localhost
  22.  
  23. 127.0.0.1   www.localhost
  24.  
  25. 127.0.0.1   www.subdomena1.localhost
  26.  
  27. 127.0.0.1   www.subdomena2.localhost
  28.  


Zapisujemy plik i kierujemy się w stronę Apacha.
Najpierw oczywiście utwórzmy odpowiednie foldery, do których będziemy kierowali vhosty, np.:

  1. C:\WWW\subdomena1
  2.  
  3. C:\WWW\subdomena2
  4.  

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!):

  1. ścieżka/do/apache2/conf/httpd.conf

i szukamy linii wyglądającej tak:

  1. Include conf/extra/httpd-vhosts.conf

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):

  1. ścieżka/do/apache2/conf/extra/httpd-vhosts.conf

Plik powinien wyglądać będzie mniej więcej tak:

  1. # Virtual Hosts
  2.  
  3. #
  4.  
  5. # Required modules: mod_log_config
  6.  
  7.  
  8.  
  9. # If you want to maintain multiple domains/hostnames on your
  10.  
  11. # machine you can setup VirtualHost containers for them. Most configurations
  12.  
  13. # use only name-based virtual hosts so the server doesn't need to worry about
  14.  
  15. # IP addresses. This is indicated by the asterisks in the directives below.
  16.  
  17. #
  18.  
  19. # Please see the documentation at
  20.  
  21. # <URL:http://httpd.apache.org/docs/2.4/vhosts/>
  22.  
  23. # for further details before you try to setup virtual hosts.
  24.  
  25. #
  26.  
  27. # You may use the command line option '-S' to verify your virtual host
  28.  
  29. # configuration.
  30.  
  31.  
  32.  
  33. #
  34.  
  35. # VirtualHost example:
  36.  
  37. # Almost any Apache directive may go into a VirtualHost container.
  38.  
  39. # The first VirtualHost section is used for all requests that do not
  40.  
  41. # match a ServerName or ServerAlias in any <VirtualHost> block.
  42.  
  43. #
  44.  
  45. <VirtualHost *:80>
  46.  
  47.     ServerAdmin webmaster@dummy-host.example.com
  48.  
  49.     DocumentRoot "c:/www"
  50.  
  51.     ServerName localhost
  52.  
  53.     ServerAlias localhost
  54.  
  55.     ErrorLog "logs/localhost-error.log"
  56.  
  57.     CustomLog "logs/localhost-access.log" common
  58.  
  59. </VirtualHost>
  60.  


Każdy blok <VirtualHost>...</VirtualHost> to definicja oddzielnego vhosta.
Dodajmy więc nasze vhosty, które zdefiniowaliśmy w pliku hosts jako:

  1. subdomena1.localhost
  2.  
  3. subdomena2.localhost
  4.  

Zrobimy to, dodając kolejny blok z definicją:

  1. <VirtualHost *:80>
  2.  
  3.     ServerAdmin nasz@email.com
  4.  
  5.     DocumentRoot "c:/www/subdomena1"
  6.  
  7.     ServerName subdomena1.localhost
  8.  
  9.     ServerAlias subdomena1.localhost
  10.  
  11.     ErrorLog "logs/subdomena1-error.log"
  12.  
  13.     CustomLog "logs/subdomena1-access.log" common
  14.  
  15. </VirtualHost>
  16.  

I analogiczny blok dla subdomeny2:

  1. <VirtualHost *:80>
  2.  
  3.     ServerAdmin nasz@email.com
  4.  
  5.     DocumentRoot "c:/www/subdomena2"
  6.  
  7.     ServerName subdomena2.localhost
  8.  
  9.     ServerAlias subdomena2.localhost
  10.  
  11.     ErrorLog "logs/subdomena2-error.log"
  12.  
  13.     CustomLog "logs/subdomena2-access.log" common
  14.  
  15. </VirtualHost>
  16.  


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


  1. <VirtualHost *:80>

Definiuje na jakim porcie dla tego hosta ma nasłuchiwać serwer, domyślnie jest to port HTTP 80, czasami 8080.

  1. ServerAdmin nasz@email.com

Określna adres email admina serwera, możemy tutaj podać cokolwiek

  1. DocumentRoot "c:/www/subdomena2"

Wskazuje pełną ścieżkę do katalogu głównego na jaki prowadzić będzie adres hosta

  1. ServerName subdomena2.localhost

Definiuje nazwę hosta, musi odpowiadać wpisowi w pliku hosts

  1. ServerAlias subdomena2.localhost

Definiuje alias dla hosta, musi odpowiadać wpisowi w pliku hosts

  1. ErrorLog "logs/subdomena2-error.log"

Ustawia plik z logami błędów na logs/subdomena2-error.log

  1. CustomLog "logs/subdomena2-access.log" common

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.:

  1. ServerAlias *.subdomena1.localhost


Nasz plik finalnie wyglądać będzie więc mniej więcej tak:

  1. # Virtual Hosts
  2.  
  3. #
  4.  
  5. # Required modules: mod_log_config
  6.  
  7.  
  8.  
  9. # If you want to maintain multiple domains/hostnames on your
  10.  
  11. # machine you can setup VirtualHost containers for them. Most configurations
  12.  
  13. # use only name-based virtual hosts so the server doesn't need to worry about
  14.  
  15. # IP addresses. This is indicated by the asterisks in the directives below.
  16.  
  17. #
  18.  
  19. # Please see the documentation at
  20.  
  21. # <URL:http://httpd.apache.org/docs/2.4/vhosts/>
  22.  
  23. # for further details before you try to setup virtual hosts.
  24.  
  25. #
  26.  
  27. # You may use the command line option '-S' to verify your virtual host
  28.  
  29. # configuration.
  30.  
  31.  
  32.  
  33. #
  34.  
  35. # VirtualHost example:
  36.  
  37. # Almost any Apache directive may go into a VirtualHost container.
  38.  
  39. # The first VirtualHost section is used for all requests that do not
  40.  
  41. # match a ServerName or ServerAlias in any <VirtualHost> block.
  42.  
  43. #
  44.  
  45. <VirtualHost *:80>
  46.  
  47.     ServerAdmin webmaster@dummy-host.example.com
  48.  
  49.     DocumentRoot "c:/www"
  50.  
  51.     ServerName localhost
  52.  
  53.     ServerAlias *.localhost
  54.  
  55.     ErrorLog "logs/localhost-error.log"
  56.  
  57.     CustomLog "logs/localhost-access.log" common
  58.  
  59. </VirtualHost>
  60.  
  61.  
  62.  
  63. <VirtualHost *:80>
  64.  
  65.     ServerAdmin nasz@email.com
  66.  
  67.     DocumentRoot "c:/www/subdomena1"
  68.  
  69.     ServerName subdomena1.localhost
  70.  
  71.     ServerAlias *.subdomena1.localhost
  72.  
  73.     ErrorLog "logs/subdomena1-error.log"
  74.  
  75.     CustomLog "logs/subdomena1-access.log" common
  76.  
  77. </VirtualHost>
  78.  
  79.  
  80.  
  81. I analogiczny blok dla subdomeny2:
  82.  
  83. <VirtualHost *:80>
  84.  
  85.     ServerAdmin nasz@email.com
  86.  
  87.     DocumentRoot "c:/www/subdomena2"
  88.  
  89.     ServerName subdomena2.localhost
  90.  
  91.     ServerAlias *.subdomena2.localhost
  92.  
  93.     ErrorLog "logs/subdomena2-error.log"
  94.  
  95.     CustomLog "logs/subdomena2-access.log" common
  96.  
  97. </VirtualHost>
  98.  


Zapisujemy plik.
Poprawność konfiguracji vhostów możemy zweryfikować w konsoli, wpisując:

  1. ścieżka/do/apache2/bin/httpd -S


Jeśli wszystko jest OK, to restartujemy Apache'a, możemy to zrobić poleceniem:

  1. ścieżka/do/apache2/bin/httpd -k restart


To wszystko.
Od tej chwili możemy korzystać z naszych wirtualnych hostów pod adresami:

  1. http://subdomena1.localhost
  2.  
  3. http://subdomena2.localhost
  4.  


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:

  1. http://localhost/aplikacja1
  2.  
  3. http://localhost/aplikacja2
  4.  
  5. ...itd
  6.  

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ć.

3 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ń
  3. Bardzo fajnie opisany artykuł. Gdyby jednak ktoś miał nadal problem z instalacją i konfiguracją to zrobiłem szczegółowy poradnik jak krok po kroku zainstalować i skonfigurować serwer lokalny z obsługą wielu stron, PHP i mySQL: https://antosik.dev/poradniki/instalacja-serwera-lokalnego-z-obsluga-wielu-stron/

    OdpowiedzUsuń

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

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