W trakcie tworzenia strony internetowej oczywistą sprawą jest to, że chcielibyśmy przetestować, jak nasz produkt będzie sprawował się w środowisku produkcyjnym. Instalujemy więc lokalnie serwer testowy [np. WAMP, XAMPP] tak, aby wersje poszczególnych komponentów „pasowały” do tych, które będą obecne na serwerze docelowym. W ten sam sposób dostosowujemy też konfigurację tychże, tak, aby przeprowadzana symulacja była maksymalnie zgodna [np. ustawienia dotyczące register_globals czy magic_quotes_gpc - czasem można trafić na "ciekawy" serwer produkcyjny, stąd trzeba zadbać o wszystkie, nawet przestarzałe / zdeprecjonowane możliwości]. Dumni z siebie uruchamiamy serwer i wpisujemy w przeglądarce http://localhost/NaszProjekt/trunk/web/index.php…
Wstęp.
…i patrzymy na dosyć mało „apetyczny” adres naszego jakże wspaniałego projektu. Biorąc pod uwagę to, że nasz [jakże wspaniały] klient prawdopodobnie będzie chciał, żeby „zainstalować” jego nową stronę pod [jakże wspaniałym] adresem http://klient.com/ nasz „localhost” wygląda „mocno średnio” – dodatkowo kopiując gdziekolwiek lokalny adres testowy będziemy mieli bardzo duży narzut na pierwszą, „domenową” część linka. Jak można temu zaradzić?
Na czym to polega?
Oczywiście można wykorzystać tytułowe wirtualne hosty. ;] Wirtualne hosty [ang. virtual hosts lub po prostu vhosts] to sposób na tworzenie własnych „wirtualnych domen”, które będą dostępne tylko na naszym komputerze. Oczywiście przy pewnych bardziej zaawansowanych konfiguracjach możliwy jest także dostęp „z zewnątrz”, jednak w tym wpisie pozwolę sobie pominąć ten aspekt.
Jeśli nie słyszeliście jeszcze takiego pojęcia i myślicie, że nie mieliście z nim nigdy do czynienia, to muszę wyprowadzić Was z błędu – bo jeśli korzystaliście z wcześniej wspomnianego lokalnego serwera, to korzystaliście także z hosta jakim jest sam http://localhost/. Jak łatwo można zauważyć dostęp do tworzonej domeny mamy pod adresem http://[nazwa]/, jedyna różnica polega na tym, że zamiast odwoływać się do zewnętrznego serwera cała komunikacja zamyka się w ramach naszego komputera.
Myślę, że nie potrzeba więcej wyjaśnień – przejdźmy do praktyki. Aby stworzyć własny wirtualny host będziemy musieli przejść przez kilka prostych kroków, które zostały opisane poniżej.
/etc/hosts
Pierwszym krokiem będzie dodanie wpisu hosta w pliku /etc/hosts – zawiera on listę rozpoznawalnych „nazw” i odpowiadające im adresy IP – w systemie Windows znajduje się on w drzewie:
[dysk]:\WINDOWS\system32\drivers\etc
Oczywiście [dysk] to litera partycji systemowej. Jeśli wcześniej nie wprowadzaliście w nim żadnych zmian, to jest bardzo duża szansa, że będzie 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
Jak widać sam plik zawiera wyjaśnienie celu swojego istnienia oraz posiadanej zawartości, także nie będę duplikował materiałów. ;] Warto jednak zauważyć, że zgodnie z wykomentowanym przykładem w nazwie tak utworzonej domeny mogą znajdować kropki, stąd nie ma żadnego problemu w mapowaniu adresu google.com na nasz lokalny serwer. ;] Przypuśćmy jednak, że nie będziemy sabotować jednej z najczęściej odwiedzanych stron na świecie i stworzymy sobie lokalnie „przykładowy” host example.com. Dodajemy więc wpis:
127.0.0.1 example.com
I voila, mapowanie załatwione. Dlaczego 127.0.0.1? Ponieważ chcemy, żeby ten adres był rozpoznawany i adresowany wewnątrz naszego komputera / systemu operacyjnego / karty sieciowej. Po prostu chcemy, żeby example.com był przypisany do tego samego serwera, ale wskazywał na inny katalog. Teraz musimy jeszcze zmusić serwer Apache do rozpoznania takiego hosta i wskazania odpowiedniego katalogu stojącego za domeną. A więc:
httpd.conf
Cała [no, prawie ;]] konfiguracja serwera Apache znajduje się w pliku httpd.conf, zaś sam plik powinien być w podkatalogu /conf instalacji [w moim przypadku [pakiet WAMP] jest on zlokalizowany w drzewie:
wamp/bin/apache/apache2.2.8/conf
Jak możemy zauważyć znajduje się w nim wiele różnych niezrozumiałych zapisów znajdują się w nim ustawienia wielu różnych elementów, ;] więc dobrze będzie trzymać nasze „dodatki” w jednym ustalonym miejscu, zamiast dopisywać je w losowych / bliżej nieokreślonych miejscach. Odszukajmy zatem linijkę:
# Virtual hosts #Include conf/extra/httpd-vhosts.conf
Pod tą linijką umieścimy odpowiednie dyrektywy. Uprzedzam pytania – oczywiście możemy odkomentować drugą linijkę z powyższego listingu i tam wstawić nasze wpisy – kwestia wygody / gustu, ponieważ w żaden sposób nie zmieni to działania samego mechanizmu. Myślę, że podanie gotowego kodu i późniejsze objaśnienie będzie dobrym sposobem na zaprezentowanie rozwiązania, a zatem:
<VirtualHost *:80> DocumentRoot [ścieżka] ServerName example.com </VirtualHost>
Fragment [ścieżka] należy oczywiście zamienić na ścieżkę bezwzględną do głównego katalogu naszego projektu [a dokładniej do katalogu zawierającego plik wykonywalny, np. index.php bądź plik .htaccess, który przekieruje nas do pliku docelowego]. Należy też pamiętać, ze w tej ścieżce musimy stosować format zapisu znany z systemów Linux / Unix, a więc każdy adres w stylu:
C:\moja\fajna\strona
musi zostać zapisany jako:
C:/moja/fajna/strona
Co się dzieje w podanym wyżej kodzie? Otóż, w pierwszej linijce wskazujemy, że właśnie rozpoczyna się deklaracja danych vhosta, który będzie dostępny z dowolnego adresu pod portem 80, czyli domyślnym dla protokołu HTTP. Następnie klauzula DocumentRoot wskazuje na żądany katalog, a ServerName ustala nazwę, pod którym dany host będzie dostępny. Znacznik zamykający elementu VirtualHost oznacza, że deklarowanie danych zostało zakończone.
Należy tutaj zauważyć, że w momencie, kiedy umieścimy taką deklarację w pliku httpd.conf to przestanie nam działać host domyślny – localhost. Aby „przywrócić” go do życia musimy go potraktować podobnie jak example.com powyżej:
<VirtualHost *:80> DocumentRoot [ścieżka] ServerName localhost </VirtualHost>
Możemy teraz przejść do ostatniej, najprzyjemniejszej części. ;]
Restart serwera.
Aby wprowadzić nasze zmiany „w życie” musimy zrestartować system serwer. Aby to zrobić wystarczy skorzystać z menu kontekstowego ikonki w trayu, w przypadku WAMPa jest to pozycja „Apache -> Service -> Restart Service„.
Teraz możemy się już cieszyć naszym wirtualnym hostem i testować naszą jakże wspaniałą aplikację http://localhost/NaszProjekt/trunk/web/index.php… pod adresem http://example.com/. ;] Oczywiście podana wyżej konfiguracja hosta jest najprostszą z możliwych, stąd polecam zapoznanie się z dokumentacją Apache na ten temat i dodawanie na własną rękę dyrektyw pomiędzy znacznikami VirtualHost. Oczywiście aby dodać kolejne hosty należy powtórzyć wszystkie kroki jeszcze raz [pomijając oczywiście pewne "jednorazowe" kroki, takie jak dodanie elementu VirtualHost dla serwera localhost ;]].
Podsumowanie.
Mam nadzieję, że powyższy poradnik pomoże Wam w zrozumieniu idei wirtualnych hostów oraz tworzeniu ich na własne potrzeby. Pamiętajcie jednak, żeby programować Wasze strony tak, aby były w stanie działać zarówno wywoływane z zawiłego katalogu, jak i z wirtualnego hosta – miałem okazję pracować z kilkoma skryptami, które niestety nie rozumiały „co się do nich mówiło” podczas wywołania przez ścieżkę bezpośrednią [w drugą stronę zawsze działało ;]], stąd nie nadkładajcie pracy innym [i sobie]. ;]
Przy okazji – jakie macie doświadczenia w pracy z wirtualnymi hostami? Czy korzystacie z nich przy tworzeniu projektów, czy jest to dla Was tylko zbędny dodatek do testów? Czy wykorzystujecie wirtualne hosty do innych ciekawych rzeczy? Będę wdzięczny za wszelkie opinie i informacje.
Warto przeczytać.
Trwa ładowanie…
Nice:). Szkoda że dopiero teraz o tym piszesz i sam musiałem się z tym pomęczyć:), ale początkującym moim znajomym będę mógł polecić ten artykuł. Pzdr
Cieszę się, bo rozumiem wpis:D Dla mnie osobiście, bardzo przydatna to wiedza. Na bank wykorzystam tego posta czynnie. Dzięki wielkie:D
A ile razy mówiłem, że jak masz jakiś problem to pisz od razu? ;] Dzięki temu ja mam nowe pomysły na wpisy, a Ty masz solidną pomoc. ;]
Da się? Da się? Proste, że się da. ;]
Cieszę się, że napisałem to w miarę zrozumiałym dla Ciebie językiem – będę się starał też przy kolejnych wpisach. ;]
Super na pewno postawie sobie taki serwer, już kiedyś chciałem takowy postawić ale mi się nie udało. Dziękuję za poradnik i pozdrawiam
Cieszę się, że mogłem pomóc, powodzenia w stawianiu vhostów! ;]
A można jakoś skonfigurować także subdomeny?
Np. a.example.com b.example.com itd?
ok, już mi się udało to zrobić :) Ważne jest aby dodać dyrektywę NameVirtualHost. Np. NameVirtualHost *:80 przed konfiguracją vhostów.
To ja jeszcze tylko dodam, że subdomena to oddzielna nazwa, nie mająca nic wspólnego z główną domeną, także VHost dla niej powinien zostać skonfigurowany jako oddzielny wpis w pliku konfiguracyjnym Apache’a. Nawet w przypadku stosowania wildcardów dla subdomen to jest tylko poinformowanie Apache, że ma łapać wszystkie żądania przychodzące do adresów o podanej strukturze.
Ciekawy artykuł, sporo w nim wyjaśniasz, ale ciekawi mnie coś bardziej praktycznego… Aktualnie staram się zrobić 2 niezależne serwisy www, każdy z osobną domeną, załóżmy x.pl i z.pl i zmapowane w DNS na jeden wspólny adres IP powiedzmy 1.1.1.1. Czy można jakoś „przerobić” twoją metodę vhostów w WAMP’ie tak aby każdy serwis działał sobie niezależnie, tzn. gdy ktoś z Sieci wklepie x.pl to wejdzie na „X”, a gdy z.pl to wyświetli się zupełnie inny serwis „Z”. Wiem, że to dość łopatologiczne pytanie – wybacz proszę za mój ewidentny brak wiedzy :)
Nie widzę powodu, żeby Ci cokolwiek wybaczać, bo ja się po prostu nie gniewam – przecież kilka lat temu sam wiedziałem tyle, co nic, także jestem dokładnie świadomy tego, że „kiedyś trzeba się dowiedzieć”. Z drugiej strony wyśmiewanie kogokolwiek za brak wiedzy jest po prostu bezsensowne i mało kulturalne, a ja sobie cenię takie wartości. ;]
W kwestii Twojego komentarza – czy mógłbyś jeszcze trochę rozjaśnić swoją ideę, bo nie do końca rozumiem, dlaczego miałbyś „przerabiać” moją metodę vhostów. Jeśli masz dwa oddzielne serwisy, na oddzielnych domenach, tylko oba na tym samym IP, to taką funkcjonalność zapewnia Ci każdy hosting, zwyczajnie wrzucając obie strony do oddzielnych katalogów na serwerze. IP nie jest tutaj żadną przeszkodą, ponieważ jak sam widziałeś, mapowałem wszystkie wpisy na adres 127.0.0.1, a posiadałem więcej niż dwie „oddzielne pozycje”.
Jeśli moja powyższa odpowiedź nie będzie satysfakcjonująca, to proszę opisz dokładniej efekt, który chcesz uzyskać. Chętnie pomogę w każdym przypadku, tylko powiedz mi czym moje rozwiązanie we wpisie różni się od tego, co chcesz mieć. ;]
Cześć,
dzięki za błyskawiczną odpowiedź! Bawiłem się z małymi przerwami i stąd to opóźnienie z mojej strony. Wracając do tematu… rzeczywiście, zastosowałem Twoją metodę i działa bardzo dobrze. Jeśli w przyszłości ktoś by robił coś podobnego to tutaj jest config vhost’ów z pliku httpd-vhosts.conf:
DocumentRoot „F:/wamp/www/strona-osiedla/”
ServerName osiedle.twoja-domena.pl
ServerAlias http://www.osiedle.twoja-domena.pl
DocumentRoot „F:/wamp/www/sklep-internetowy/”
ServerName sklep.inna-domena.pl
ServerAlias http://www.sklep.inna-domena.pl
Oczywiście nazwy domen przed .pl zostały zmienione na „przykładowe”. Wspomnę jeszcze, że wg twojej rady pogrzebałem w panelu dostawcy moich domen i w opcjach DNS dla obydwu domen ustawiłem identyczny adres IP.
Co ciekawe dla strony „osiedlowej” adres mogę wpisać z „www.” lub bez tego przedrostka i wszystko działa, natomiast dla „Sklep” działa tylko jeśli NIE wpiszę www. na początku. Jeśli wpiszę to www. to dostaję klasyczne 404. Myślę, że to coś w ustawieniach samego Apache. Dam znać gdy rozwiążę tego „kejsa” :)
FYI… Zauważyłem, że w moim poprzednim komentarzu skrypt automatycznie usunął wpisy VirtualHost *:80 oraz /VirtualHost (obydwa w „ostrych” nawiasach tak jak artykule Autora). Znajdują się one oczywiście na początku i na końcu akapitów tworzących hosta.
Jeśli będziesz dodawał kolejne komentarze, spróbuj używać wstawek „code” w nawiasach kwadratowych, podobnie jak w bbCode, myślę, że wtedy nie będzie Ci ucinało takich fragmentów.
Nie tyle ustawieniach Apache, ile po prostu błąd w idei – subdomena „www” nie jest w żadnym wypadku ustaloną odgórnie – należy zrobić w najgorszym przypadku oddzielny VHost dla http://www.domena, a w najlepszym podpiąć taki alias pod istniejący wpis z VHostem.
Cieszę się, że Ci się udało – jeśli będziesz miał jeszcze jakieś problemy, to pisz śmiało. Zachęcam do odwiedzania i komentowania także nowych wpisów. ;]
Super wpis, bo prostym językiem napisany. Czy rozwiniesz aspekt dostępu z zewnątrz w kolejnym wpisie (dynamiczne IP)? Pozdrawiam.
Nie za bardzo rozumiem – jakiego dostępu z zewnątrz? Ten wpis ma za zadanie pokazać jak sobie ułatwić pracę symulując realne miejsce instalacji strony [własna domena] – te nazwy nie są / nie mogą być w żaden sposób dostępne z zewnątrz. Nie wiem też, co do tego wszystkiego ma dynamiczne IP. Jeśli tylko mogłabyś nieco rozwinąć swój pomysł / problem tak, żebym mógł zrozumieć jaki jest Twój cel, to na pewno podejmę się tego tematu.
„Oczywiście przy pewnych bardziej zaawansowanych konfiguracjach możliwy jest także dostęp „z zewnątrz”, jednak w tym wpisie pozwolę sobie pominąć ten aspekt.” Właśnie to zdanie mnie zainteresowało. Ciekawa jestem co miałeś na myśli. A odnośnie dynamicznego IP, to chodziło mi o domenę w internecie, a nie w sieci lokalnej, umieszczoną na serwerze WAMP – nie wiem jak to zrobić.
Wiesz, tutaj cały problem polega na tym, że przy dynamicznym IP Twój komputer nie będzie mógł być widziany pod konkretną domeną, także sam problem VHostów rozwiązuje się jako „nie do naprawy”. Jeśli zaś miałabyś komputer identyfikowany przez statyczne IP i serwer WAMP, to ze względu na fakt, że nie mam sprzętu to zreprodukować, mogę powiedzieć tylko tyle, że ustawienie odpowiednich adresów zamiast z „localhost”, czyli 127.0.0.1 na ten konkretny adres IP powinno umożliwić „widzenie” Twoich danych jako normalnych stron internetowych. Zwyczajnie wtedy Twój „localhost” zaczyna stanowić serwer publicznie widziany przez serwery DNS.
Pingback: [Apache] Przypisanie i obsługa wielu domen do wirtualnego hosta. « Tomasz Kowalczyk
Fajny wpis. Bardzo się przydał. Ale mam problem z
Forbidden
You don’t have permission to access / on this server.
Pytanie mam co do lokalizacji naszego projektu. Na moim Wampie vhosty działają tylko wtedy jeżeli wrzucę je do katalogu C:/wamp/www
Co i gdzie muszę wpisać w pliku konfiguracyjnym apacha żebym mógł podawać dowolną lokalizację DocumentRoot. Przykład moich vhostów
NameVirtualHost *:80
DocumentRoot C:/book/aaa
ServerName example.com
DocumentRoot C:/wamp/www/qwerty
ServerName qwerty.com
Po wpisaniu adresu example.com pojawia się
Forbidden
You don’t have permission to access / on this server.
jak temu zaradzić?
Bardzo fajny artykuł. Przydał się, ale mógłbyś jeszcze jedną rzecz dopisać tutka.
Po wpisaniu nazwy wirtualnego hosta – u Ciebie example.com – pojawia się komunikat błędu 403
Forbidden
You don’t have permission to access / on this server.
Dopiero umieszczenie Document Root w katalogu C:/wamp/www/ sprawia, że wszystko działa i hula.
Ale nie musimy być skazani na powyższy katalog. Kiedy nadamy uprawnienia mozemy umieszczać nasz projekt tam gdzie mamy ochotę.
Moje hosty wygladają jak ponizej.
NameVirtualHost *:80
DocumentRoot C:/vhosts/xxx
ServerName example.com
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
DocumentRoot C:/wamp/www/dict
ServerName dict.com
Ja opisałem problem z mojego punktu widzenia, a że trzymam wszystkie projekty w jednym katalogu na dysku twardym, to i nie wnikałem w takie szczegóły. DocumentRoot mam ustawiony właśnie na ten katalog, także wszystkie inne są „relatywne” do niego.
Z Twojego komentarza płynie ciekawy wniosek, że VHosty mogą być zawarte poza katalogiem DocumentRoot, o czym szczerze mówiąc nie pomyślałem nawet. ;] Myślę, że komentarz w tej postaci będzie ciekawym uzupełnieniem dla niniejszego artykułu.
PS Chyba ucięło znaczniki „VirtualHost”, jeśli możesz, to podaj jeszcze raz cały kod, zamieniając nawiasy ostre na kwadratowe.
PHP- Funkcja sprintf przyjmująca zmienną liczbę argumentów
Ech, ten komentarz nie wiedzieć czemu poleciał do spamu. Dobrze, że przeglądam czasem tą zakładkę, dlatego wydobyłem go na światło dzienne.
Odpowiedzi na swoje pytanie udzieliłeś sam w poniższym komentarzu, więc mój jest zbędny. ;]
PHP- Funkcja sprintf przyjmująca zmienną liczbę argumentów
Wielkie gratki dla autora. Sporo się naszukałem takiego tematu w sieci i wszędzie był nie do końca opisany, albo zawierał błędy.
Mam Windows 7 x64, miałem mały problem z zapisaniem w katalogu windows/system32/drivers/etc pliku hosts (chodzi mi o edycję) pomimo, że jestem jednym użytkownikiem i jednocześnie administratorem. Obszedłem to poprzez skopiowanie tego pliku na pulpit, dopisanie adresu ip i rozpoznawalnej nazwy, zapisanie i ponowne skopiowanie z pulpitu do wspomnianego katalogu z potwierdzeniem nadpisania. Oczywiście załączył mi się monit, że muszę mieć uprawnienia administratora (nie wiem po co skoro konto na którym pracuję jest kontem administratora :)), jedynie potwierdziłem i plik został skopiowany.
Oczywiście specjalnie mam ściągniętą wersję WAMP’a dla wersji systemu x64
Przy okazji skorzystałem sobie z porady kolegi Matt’a, faktycznie po ustawieniu sobie innego katalogu niż wamp/www potrzeba nadać uprawnienia do tego nowego katalogu. U kolegi jednak zabrakło pewnego drobiazgu, przez co po zastosowaniu się do jego rady apache wcale mi nie wystartował. Cały wpis powinien wyglądać następująco – idę za przykładem kolegów (Aby nic mi nie obcięło to co powinno być napisane w nawiasach ostrych piszę w nawiasach półokrągłych, więc należy to wziąć pod uwagę przepisując):
(VirtualHost *:80)
DocumentRoot C:/vhosts/xxx
ServerName example.com
(Directory „c:/vhost/xxx”)
Options Indexes FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
(/Directory)
(/VirtualHost)
Jeszcze jedna uwaga co do pliku hosts w katalogu windowsa.
Po przypisaniu adresu np. 127.0.0.1 example.com (Tak jak jest w przykładzie) u mnie ładowała się strona startowa z wampservera (no ta co zawsze bez przypisywania jakichkolwiek hostów), pomimo przypisania 2 wirtualnego hosta (według opisu autora) dla localhost ‚a
Moim skromnym zdaniem bezpieczniej jest użyć przed wpisem ipconfig w konsoli cmd i przypisanie ip komputera na którym jest zainstalowany apache (w większości przypadków np. 192.168.1.10 example.com) w ten sposób dalej nam działa localhost i osobno powiązany katalog pod adresem example.com, no i jeszcze możemy się też do niego dostać wpisując w przeglądarkę adres ip, ale to już chyba oczywiste jest.
Dzięki za długi i bardzo informatywny komentarz. Co do pliku /etc/hosts – sztuczka polega na tym, że trzeba uruchomić Notatnik na prawach administratora i dopiero potem na nim operować – ja pisałem ten wpis siedząc jeszcze pod XP.
Nie wiem, czy przypisywanie adresu innego niż 127.0.0.1 powinno być uznane za rozwiązanie – nigdy nie musiałem robić tego inaczej i nie słyszałem, żeby ktoś miał z tym kłopoty, a już kilka razy WAMPa stawiałem. Jednak jeśli Tobie to działa, to nie będę się kłócił. ;]
Konferencja Falsy Values 2011
czegos takiego szukalem caly tydzien….. doskonaly opis!!!!
Dzięki wielkie, dużo to mi wyjaśniło, szkoda tylko, że tak późno na to wpadłem, bo męczyłem się strasznie. Jedyną publikacją jaką do tej pory znalazłem było http://www.komp.waw.pl/index.php/poradnik-informatyczny/2-wlasny-serwer-www-na-windowsie