Apache i vhosty
Protokół HTTP, którego każdy z nas używa na codzień, pozwala nam na robienie wirtualnych hostów WWW, czyli na jednym serwerze WWW i jednym adresie IP umieszczenie kilku niezależnych od siebie stron WWW. Konfiguracja czegoś takiego jest bardzo prosta. Z góry jednak przepraszam za toporność tego tekstu - nie mam nastroju na lanie wody dzisiaj ;-)… Poza tym jak zwykle opisuje on najprostszy sposób wykonania vhostów jak i tylko podstawowe możliwości apache’a w tym zakresie.
Chciałbym przypomnieć także, iż każdy vhost (domena) musi być oczywiście skonfigurowana w danej domenie. Tzn. ja dzisiaj jeszcze kawy nie piłem i nie wiem jak to napisać aby każdy zrozumiał. Poprostu jeżeli wszystko skonfigurowałeś, a niestety nowe wychuchane i wypucowane vhosty Ci nie chodzą, wykonaj komendę “host mój.nowy.kochany.vhost.pl” - jeżeli ta komenda nie zwróci jakiejś nazwy albo adresu to już masz źródło swoich błędów. Jeżeli nie wiesz o czym tutaj bredzę, poprostu idź i poczytaj o dns i spróbuj ponownie ;)
Na początek musimy odnaleźć plik httpd.conf. Najczęściej jest to plik /etc/apache/httpd.conf (Slackware 8, Mandrake i Redhat) lub /etc/httpd/httpd.conf (PLD, starsze RH i MDK). Inne możliwe lokalizacje to: /etc/httpd.conf, /etc/www/httpd.conf, /var/lib/apache/conf/httpd.conf (Slackware 7.1, 7.0), /usr/local/apache/conf/httpd.conf (Apache ze źródeł). Domyślnie, apache ma zdefiniowany główny katalog www dyrektywą DocumentRoot, np:
DocumentRoot "/var/www/htdocs"
Zasada działania.
Po zdefiniowaniu konkretnego adresu IP jako adresu do wirtualek zaczyna on inaczej funkcjonować niż pozostałe adresy. Otóż w tym momencie dla tego adresu IP nie obowiązuje globalnie zdefiniowany DocumentRoot, tylko pierwsza zdefiniowana wirtualka. Czyli, jeżeli ktoś się odwoła do tego adresu IP do nazwy nie zdefiniowanej jako wirtualka, zostanie mu wyświetlona zawartość pierwszej wirtualki. Na pozostałych adresach nadal domyślną stroną www będzie ta z katalogu podanego w dyrektywie DocumentRoot. Teraz przykład. Mój serwer posiada adres IP 217.8.186.57. Chciałbym, aby każdy odwołujący się do tego adresu IP widział moją stronę, oraz chciałbym do tego dorzucić parę wirtualnych hostów. Robię więc tak:
# # Definuje że 217.8.186.57 jest adresem ip na którym będę robił vhosty: # NameVirtualHost 217.8.186.57 # # Teraz zdefiniujemy główną wirtualkę: # Wirtualka ta się zowie www.baseciq.org, a jej główny katalog # jest u mnie w katalogu domowym w public_html # <VirtualHost 217.8.186.57> ServerName www.baseciq.org DocumentRoot /home/users/baseciq/public_html ServerAdmin baseciq@baseciq.org </VirtualHost> # # Na swojej stronie mam trochę plików, udostępnie je pod # adresem http://ftp.baseciq.org/ # <VirtualHost 217.8.186.57> ServerName ftp.baseciq.org DocumentRoot /home/users/baseciq/public_html/files ServerAdmin baseciq@baseciq.org </VirtualHost> # # O, i jeszcze jeden taki malutki vhost ;> # <VirtualHost 217.8.186.57> ServerName radded.baseciq.org DocumentRoot /home/users/baseciq/public_html/radded ServerAdmin baseciq@baseciq.org </VirtualHost>
Oczywiście możemy zrobić teraz wirtualki na innych adresach ip o ile je posiadamy. Poprostu dopisujemy kolejne NameVirtualHost [adresip] i pod nim na takich samych zasadach wirtualki dla następnego adresu IP. Można także zdefiniować kilka nazw wskazujących na jeden katalog, na przykład chcemy zrobić writualkę www.domena.pl i domena.pl. Wtedy zamiast robienia kiku wpisów z wirtualkami tworzymy jeden z dyrektywą ServerAlias:
<VirtualHost 213.25.209.99> ServerName domena.pl ServerAlias www.domena.pl DocumentRoot /var/www/vhosts/domena.pl ServerAdmin webmaster@domena.pl </VirtualHost>
Dzięki temu mamy jako taki porządek w httpd.conf
Opisany powyżej wycinek httpd.conf z mojego serwera można obejrzeć w akcji:
http://www.baseciq.org/ - podstawowa wirtualka,
http://ftp.baseciq.org/ - druga wymieniona wirtualka,
http://radded.baseciq.org/ - trzecia wirtualka.
Tych wirtualek nie ma, ale po wejściu na nie zostanie wam wyświetlona podstawowa strona tego adresu ip (poniższe hosty wskazują na 217.8.186.57):
http://217.8.186.57/ - tutaj oczywiście sam adres a nie host ;)
http://baseciq.zacisze.org/ (to Arek sobie dopisał :))
http://baseciq.drzwi.org/ (a to mam od Neas’a)
Generalnie 217.8.186.57 jest dodatkowym adresem serwera. Na pozostałych adresach tej maszyny (ma ona dwie karty sieciowe i co za tym idzie dwa adresy z sieci lan) obowiązuje normalne DocumentRoot.
Do VirtualHost można dorzucić kilka ciekawych rzeczy. Praktycznie każda dyrektywa główna apache’a da się zastosować lokalnie w ramach <VirtualHost IP> - </VirtualHost>. Zresztą te 3 dyrektywy których użyłem powyżej są normalnie wykorzystywane w “głównej” części konfiguracji. I tak, można na przykład dopisać w obrębie wirtualki:
CustomLog /home/users/baseciq/logi/www.log combined
Spowoduje to iż wywołania do wirtualki będą logowane do pliku www.log w moim katalogu domowym w podkatalogu ‘logi’.
ErrorDocument 404 /index.php?error=404 ErrorDocument 403 /error403.html ErrorDocument 401 /error404.html ErrorDocument 500 /error500.html
Spowoduje to iż zamiast ogólnych komunikatów błędów dla tej wirtualki będą wyświetlane pliki /home/users/baseciq/public_html/error???.html (zakładając że DocumentRoot wirtualki to /home/users/baseciq/public_html).
Opcji tych jest prawie tyle samo co głównych dyrektyw apache’a (niektórych poprostu nie da się użyć). Jednak uważam iż ten art nie jest miejscem na ich szczegółowe opisywanie.
Na koniec oczywiście pozostaje nam zrestartować apache’a. Użytkownicy RedHatów, Mandrakeów i innych podobnych dystrybucji piszą: /etc/rc.d/init.d/httpd restart (lub apache restart). W Slackware jest to /var/lib/apache/bin/apachectl restart (7.0, 7.1) lub /usr/sbin/apachectl restart.
Jeszcze taka mała uwaga na koniec. Nie denerwujcie się że wam czasami nie wychodzi wirtualka mimo poprawek… Poprostu wyłączcie proxy i wyczyśćcie cache przeglądarki, co nie sebek? :)))