artykuły

Apache - wirtualne hosty na maszynie lokalnej

14:10
czw, 21 marzec 2013
Podczas testów serwisu na maszynie lokalnej dostajemy sie do niego zwykle poprzez localhost/lhp lub KOMPUTER_W_SYPIALNI/lhp. W tym artykule pokażę jak sprawić, abyśmy mogli testować lokalnie (!) działający serwis, wpisując jakasdomena.pl lub jakasdomena.localhost (domen tych nie trzeba wykupywać). Ciekawe? Zapraszam do lektury.

Wstęp

Zwykle podczas testów serwisu nie udaje się rozwiązać wszystkich problemów z przekierowaniami, przepisywaniem adresów i innymi problemami, które ujawniają się dopiero po przeniesieniu serwisu na docelową domenę.
Podczas startu nowego serwisu miałem właśnie taką sytuację z przepisywaniem adresów. Na lokalnym serwerze musiałem używać nieco innego .htaccess niż na serwerze docelowym. Oba pliki .htaccess różniły się jedynie takim wpisem: # Maszyna lokalna RewriteBase /lhp/ # Maszyna zdalna RewriteBase / Z racji, że bardzo, ale to bardzo nie lubię pamiętać o tego typu sprawach przy bezmyślnym kopiowaniu plików na inną maszynę (nie oszukujmy się - tego typu rzeczy to główna przyczyna wszystkich problemów), postanowiłem ujednolicić sposób działania obu klonów, tak, aby przy wywoływaniu serwisu zarówno lokalnego jak i zdalnego głównym katalogiem był katalog strony, a nie główny katalog www serwera (na którym mam przecież jeszcze inne strony).
Całość więc miała działać następująco - tak, abym mógł wywoływać lokalny serwis LHP za pomocą adresu http://lhp.localhost . Po krótkiej chwili uświadomiłem sobie, że w zasadzie za pomocą sposobu, który zaraz przedstawię, mogę wywoływać nawet i http://www.onet.pl - a i tak pojawi się mój lokalny serwis :)

Do roboty

Przedstawię kroki potrzebne do konfiguracji lokalnego oprogramowania WAMP o nazwie VertrigoServ, jednak nie ma większego znaczenia jakiego środowiska używasz - ważne by było oparte o serwer Apache.

  1. Wejdź do katalogu konfiguracyjnego Apache. U mnie jest to:
    C:\Program Files (x86)\VertrigoServ\Apache\conf\
  2. W pliku httpd.conf odkomentuj linię: # Virtual hosts # Include conf/extra/httpd-vhosts.conf Powinna wyglądać tak: # Virtual hosts Include conf/extra/httpd-vhosts.conf
  3. Teraz czas skonfigurować wirtualne hosty. Ich konfiguracja znajduje się w podkatalogu "extra", w pliku "httpd-vhosts.conf" - u mnie jest to:
    C:\Program Files (x86)\VertrigoServ\Apache\conf\extra\httpd-vhosts.conf
  4. Zawartość pliku "httpd-vhosts.conf" powinna przedstawiać się następujaco: # # Virtual Hosts # # 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 # http://httpd.apache.org/docs/2.2/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. # # Use name-based virtual hosting. # NameVirtualHost *:80 # # 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 block. # <VirtualHost *:80> ServerAdmi webmaster@dummy-host.localhost DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/docs/dummy-host.localhost" ServerName dummy-host.localhost ServerAlias www.dummy-host.localhost ErrorLog "logs/dummy-host.localhost-error.log" CustomLog "logs/dummy-host.localhost-access.log" common </VirtualHost> <VirtualHost *:80> ServerAdmi webmaster@dummy-host2.localhost DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/docs/dummy-host2.localhost" ServerName dummy-host2.localhost ErrorLog "logs/dummy-host2.localhost-error.log" CustomLog "logs/dummy-host2.localhost-access.log" common </VirtualHost> Jest to po prostu zawartość, która zostanie wstawiona do pliku httpd.conf w miejscu, które odkomentowaliśmy.
  5. Dodajmy nowego wirtualnego hosta. W moim przypadku będzie to lhp.localhost: <VirtualHost *:80> # Potrzebne aby nie stracić dostępu do katalogu głównego localhost/ DocumentRoot "C:/Program Files (x86)/VertrigoServ/www/" ServerName localhost </VirtualHost> <VirtualHost *:80> DocumentRoot "C:/Program Files (x86)/VertrigoServ/www/lhp" ServerName lhp.localhost </VirtualHost> I zrestartujcie serwer (serwer wczytuje nowe ustawienia przy starcie). Taki wpis oznacza mniej więcej tyle co: dla wszystkich adresów IP jakie obsługuje serwer (do jednego serwera może być przypisanych wiele adresów IP!), usługa HTTP działająca na porcie 80 ma kierować wszystkie zapytania z parametrem Host: lhp.localhost pod "C:/Program Files (x86)/VertrigoServ/www/lhp".
    O co chodzi z tym parametrem Host? Otóż, gdy wpisujesz adres, powiedzmy, http://www.lukashp.pl , twoja przeglądarka wysyła żądanie HTTP typu GET (dokładnie określone przez protokół HTTP w tym miejscu, a w nieco bardziej zwięzłej formie tutaj, na Wiki). Wygląda ono mniej więcej tak (jest w postaci tekstu jawnego):
    GET / HTTP/1.1
    Host: www.lukashp.pl
    User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14
    Accept: text/html, application/xml;q=0.9, application/xhtml xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
    Accept-Language: en
    Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
    Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
    Connection: Keep-Alive, TE
    TE: deflate, gzip, chunked, identity, trailers
      
    (przykład tego co wysyła Opera) Takie zapytanie oznacza tyle co, GET (pobierz) / (główny plik z głównego katalogu, czyli stronę główną) używając protokołu HTTP w wersji 1.1 (to określenie formatu dalszych parametrów). Druga linijka mówi jakiego wirtualnego hosta (adresu) dotyczy zapytanie. Ktoś może zapytać teraz - no dobrze, ale czy serwer LHP nie wie pod jakim adresem sam stoi? Po co mu podawać jego własny adres? No i właśnie - tutaj jest ten haczyk, o którym wspominałem. Szkoda byłoby marnować całej maszyny dla jednego serwisu. Zwykle na jednej maszynie stoi kilkadziesiąt serwisów, dlatego, skoro wszystkie one mają ten sam adres IP - serwer musi jakoś rozróżniać do którego dokładnie serwisu chce dostać się użytkownik - określa to właśnie parametr Host.
    Parametr host jest dokładnie tym, co mamy w konfiguracji naszego wirtualnego hosta pod parametrem: ServerName nazwa_hosta
  6. Po zapisaniu wszystkich zmodyfikowanych plików i zrestartowaniu serwera, zauważycie, że adres lhp.localhost nie będzie działać :) Niestety, trzeba zrobić jeszcze jedną czynność - powiedzieć Windowsowi, że lhp.localhost stoi na localhoscie (wiem, masło maślane). W tym celu musimy zmodyfikować plik:
    C:\Windows\System32\drivers\etc\hosts
    dodając do niego linijkę:
      127.0.0.1 lhp.localhost
      
    Całość powinna wyglądać tak:
    # Copyright (c) 1993-1999 Microsoft Corp.
    #
    # To jest przykładowy plik HOSTS używany przez Microsoft TCP/IP
    # w systemie Windows.
    # Ten plik zawiera mapowania adresów IP na nazwy komputerów
    # Każdy wpis powinien być w osobnej linii.
    # W pierwszej kolumnie powinny być umieszczone adresy IP, a następnie
    # odpowiadające im nazwy komputerów. Adres i nazwa powinny być oddzielone
    # co najmniej jedną spacją
    #
    # Dodatkowo, komentarze (takie jak te) można wstawiać w poszczególnych
    # liniach lub po nazwie komputera, oznaczając je symbolem '#'.
    #
    # Na przykład:
    #
    #      102.54.94.97     rhino.acme.com          # serwer źródłowy
    #       38.25.63.10     x.acme.com              # komputer kliencki x
    
    127.0.0.1       localhost
    127.0.0.1       lhp.localhost
    
  7. To wszystko! Teraz możecie już sprawdzić działanie adresu lhp.localhost. Może być potrzebny co najwyżej restart przeglądarki (większość nowych przeglądarek ma własną pamięć DNS) albo odświeżenie systemowej tablicy DNS poleceniem:
    ipconfig /flushdns
    Wszystko powinno ruszyć.

Mój lokalny serwis pod adresem www.onet.pl?

Tak, korzystając z zamieszczonych wyżej wskazówek, można sprawić aby Twój serwis, na lokalnym komputerze, był dostępny pod adresem www.onet.pl. W tym celu wystarczy jako parametr ServerName (w pliku "httpd-vhosts.conf") podać www.onet.pl: <VirtualHost *:80> DocumentRoot "C:/Program Files (x86)/VertrigoServ/www/lhp" ServerName www.onet.pl </VirtualHost> oraz odpowiednio zmodyfikować Windowsowy plik hosts, podając dane, które podszyją nasz serwis pod adres www.onet.pl:

127.0.0.1       www.onet.pl
Spójrzcie tylko :) (na adres)
LHP pod adresem <a href=www.onet.pl" /> Zauważcie jednak, że strona będzie działać pod www.onet.pl, ale już nie pod onet.pl (dla onet.pl trzeba dodać osobny wpis w pliku "hosts"!).

Blokowanie niektórych adresów IP

W sekcjach VirtualHost, zgodnie z dokumentacją Apache, możemy stosować prawie wszystkie dyrektywy konfiguracyjne Apache. Możemy więc dokładnie skonfigurować wirtualny serwer tak, że będzie się on zachowywał zupełnie różnie od innych wirtualnych serwerów działających na tej samej maszynie. Przykładowo, możemy zablokować dostęp do wirtualnego hosta osobom, z komputerów innych niż ten na którym działa wirtualny host (przydatne jeśli nie mamy Firewalla):

<VirtualHost 127.0.0.1:80>
  DocumentRoot "C:/Program Files (x86)/VertrigoServ/www/lhp"
  ServerName lhp.localhost
  <Directory "C:/Program Files (x86)/VertrigoServ/www/lhp">
    # Uwaga, pomiędzy Deny,Allow nie może być spacji! :) Inaczej serwer się wywali przy starcie. Ah to OpenSource!
    Order Deny,Allow
    Deny from All
    Allow from 127.0.0.1
  </Directory>
</VirtualHost>

Osobne pliki logów dla każdego wirtualnego serwera

Dla każdego utworzonego wirtualnego serwera, możemy zdefiniować odrębny plik logów. Tak się robi zawsze oferując komuś hosting. Jest to wygodne dla użytkownika, ale również i dla nas, ponieważ każe dbać użytkownikowi o quote (czyli ilość wolnej przestrzeni dyskowej przydzielonej jego koncie WWW. [Nazwa quota wzięła się od Unixowego narzędzia o tej samej nazwie pozwalającego sprawdzić ilość miejsca przydzielonego użytkownikowi systemu]).
Logi zazwyczaj umieszczane są na koncie użytkownika, ale nad katalogiem publicznym (w jednym z katalogów prywatnych).
Spójrzmy na przykład jak zrobić oddzielne pliki logów dla serwera wirtualnego:

<VirtualHost 127.0.0.1:80>
  DocumentRoot "C:/Program Files (x86)/VertrigoServ/www/lhp"
  ServerName lhp.localhost
  # Tutaj akurat definiujemy logi w głównym katalogu serwera, a nie w katalogu użytkownika
  ErrorLog logs/lhp-error_log
  TransferLog logs/lhp-access_log
</VirtualHost>

Co z IPv6?

Konfiguracja wirtualnych hostów dla IPv6 nie różni się zbytnio od tej dla IPv4. Jedyna różnica o jakiej trzeba pamiętać, to umieszczenie adresu w nawiasach kwadratowych:

<VirtualHost [2001:4a2b::1ffe]:80>
  DocumentRoot "C:/Program Files (x86)/VertrigoServ/www/lhp"
  ServerName lhp.localhost
</VirtualHost>

Zakończenie

Mam nadzieję, że podane informacje okazały się przydatne. Po bardziej szczegółowe odsyłam do stron podanych w źródłach tego artykułu. Znajdziecie tam przede wszystkim bezpośrednie odnośniki do dokumentacji dot. konfiguracji wirtualnych serwerów w Apache.

12345
Apache - wirtualne hosty na maszynie lokalnej Autor opinii: Czytelnicy, data przesłania: 0

Skomentuj

Aby zamieścić komentarz, proszę włączyć JavaScript - niestety roboty spamujące dają mi niezmiernie popalić.






Komentarze czytelników

    Nie ma jeszcze żadnych komentarzy.
    Dexter