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