koszmar z VirtualHost’ami w SuSE
Chciałbym się podzielić problemem, który zawłaszczył sobie masę mego czasu przez ostatnie dni, a związany jest z vHostami serwera Apache2 zainstalowanego na sysyemie openSuse linux. Opisuję to, ponieważ mam nadzieję, że mój wywód będzie pomocny dla osób które również spotkają się z tym dziwnym problemem, a zaświadczam, iż rozwiązanie go to nie była łatwa rzecz (tym bardziej gdy rozwiązania szuka się głównie metodą własnych “prób i błędów”).
Tak więc moim celem było uruchomienie kilku vHostów na nowo postawionym serwerze Apache2. W tym celu stworzyłem następujące dyrektywy w pliku /etc/apache2/vhosts.d/vhosts.conf :
<virtualhost *:80>
ServerAdmin webmaster@somedomain.com
DocumentRoot /srv/www/somedomain
ServerName www.somedomain.com
ServerAlias somedomain.com
</virtualhost>
<virtualhost *:80>
ServerAdmin webmaster@elsedomain.com
DocumentRoot /srv/www/elsedomain
ServerName www.elsedomain.com
ServerAlias elsedomain.com
</virtualhost>
<virtualhost *:80>
ServerAdmin webmaster@otherdomain.com
DocumentRoot /srv/www/otherdomain
ServerName www.otherdomain.com
ServerAlias otherdomain.com
</virtualhost>
Uzupełnieniem tego było umieszczenie następujących linii w pliku /etc/hosts :
127.0.0.1 www.somedomain.com 127.0.0.1 somedomain.com 127.0.0.1 www.elsedomain.com 127.0.0.1 elsedomain.com 127.0.0.1 www.otherdomain.com 127.0.0.1 otherdomain.com
I to wszystko. Pozostaje już tylko zrestartować proces Apache poprzez:
apache2ctl restart
i błąd gotowy! Oto co wyświetla się podczas uruchamiania ponownego instancji Apache:
[Wed Jul 25 21:42:59 2007]
[warn] _default_ VirtualHost overlap on port 80, the first has precedence
A cóż to oznacza? Pierwsza sekcja vHosta została potraktowana jako główna/domyślna, a każda następna po niej w jakiś niezrozumiały dla mnie sposób wchodzi w konflikt z tę pierwszą. Rezultatem tego jest, iż wywołując URL konfliktowego hosta (”elsedomain.com”, “otherdomain.com”) w przeglądarce internetowej, otrzymuję treść strony głównej hosta pierwszego, głównego (”somedomain.com”). Tego oczywiście nie chcemy.
Mam nadzieję, iż problem jest zrozumiały. Poniżej przykłady zmian, które nie przyniosły żadnej poprawy:
* zmiana dyrektyvy vHosta na:
<virtualhost *:*>
[...]
</virtualhost>
* zmiana dyrektyvy vHosta na:
<virtualhost 127.0.0.1:*>
[...]
</virtualhost>
* zmiana dyrektyvy vHosta na:
<virtualhost 127.0.0.1:80>
[...]
</virtualhost>
* zmiana adresu IP in /etc/hosts na 127.0.0.2 oraz dyrektywy vHosta na:
<virtualhost 127.0.0.2:80>
[...]
</virtualhost>
To co naprawdę pomogło, znajdywało się głównie w innym miejscu. Otóż dodałem nową linię na samym początku mego pliku vhosts.conf:
NameVirtualHost 127.0.0.1
oraz zmodyfikowałem sekcje vHostów w taki oto sposób :
<virtualhost 127.0.0.1:80>
[...]
</virtualhost>
Mimo iż jasne dla mnie było, że dyrektywa “NameVirtualHost” powinna się znajdywać w konfiguracji serwera Apache, było bardzo niełatwo wpaść na to, że to właśnie jej brakuje. Wciąż mnie zastanawia, czy jest to brak występujący tylko w dystrybucji SUSE10.2, czy może standardowo w Apache 2 nie ma jej. Z kolei zmiana znaku “gwiazdki” (*) na IP localhosta (127.0.0.1) była rzeczą oczywistą.
Jeśli więc napotkasz problem z ostrzeżeniem takim jak wyżej, mam nadzieję iż moja metoda okaże się pomocna.
Pozdrawiam
ServerAdmin webmaster@somedomain.com
DocumentRoot /srv/www/somedomain
ServerName http://www.somedomain.com
ServerAlias somedomain.com
ServerAdmin webmaster@elsedomain.com
DocumentRoot /srv/www/elsedomain
ServerName http://www.elsedomain.com
ServerAlias elsedomain.com
ServerAdmin webmaster@otherdomain.com
DocumentRoot /srv/www/otherdomain
ServerName http://www.otherdomain.com
ServerAlias otherdomain.com
przed tymi sekcjawi wpisz taką linię
NameVirtualHost *:80
i powinno działać i nie jest to tylko blad w opensuse tylko trzeba to ustawic w apachu nie zaleznie czy apacha uruchamia sie w linuxach czy windowsach
Komentarz od Hunter — 23/04/2008 @ 10:09
Niestety Bartosz ma rację. Edytor configuracji apache startowany przez yast-a wymazuje dyrektywę
NameVirtualHost więc po jej odręcznym wpisaniu już raczej nie należy posługiwać się tym edytorem, lub wpisywać ją odręcznie za każdym razem na nowo. (SuSE 11.0, apache 2.2.8)
Komentarz od Zbigniew Lisiecki — 27/08/2008 @ 20:56
Super, dzięki - Twój artykuł pomógł mi rozwiązać ten problem. Kiedyś miałem go przy konfiguracji hostów ssl-owych (ach, gdybym wtedy wiedział…), a dziś miałem do czynienia z plikiem konfiguracyjnym Apache w którym właśnie tej dyrektywy brakowało.
Komentarz od Szymon — 07/11/2009 @ 20:58
Dzięki za ten artykuł, właśnie rozwiązałem mój problem dzięki niemu, chociaż zamiast NameVirtualHost 127.0.0.1:80 dodałem po prostu NameVirtualHost *:80 i wszystko gra
Komentarz od Mariush — 22/11/2009 @ 17:26
Fajny artykuł, naprowadził mnie, chociaż u mnie wystarczyło dopisać NameVirtualHost * i później w definicjach hostów wirtualnych numer portu nie jest potrzebny bo jest skonfigurowany w listen.conf
Komentarz od marcin — 17/04/2010 @ 22:31