2013-02-08 19 views
7

Poprzednio miałem poprawnie skonfigurowany serwer Apache HTTP, aby przekazywać przychodzące żądania HTTP na porcie 80 do mojej instancji Tomcat działającej na porcie 8080. Jednak teraz jestem w sytuacji, w której muszę być w stanie do przekazywania żądań przychodzących na porcie 80 do Tomcat @ 8080 lub innego procesu @ 9000, w zależności od nazwy hosta. Poniżej znajduje się fragment mojego próby utworzenia mojego konfiguracji Apache do obsługi takiego przypadku:Serwer proxy Apache na podstawie nazwy hosta

<VirtualHost *:80> 
    ServerName hostname1 
    ProxyPreserveHost On 
    ProxyPass/http://hostname1:8080/ 
    ProxyPassReverse/http://hostname1:8080/ 
</VirtualHost> 
<VirtualHost *:80> 
    ServerName hostname2 
    ProxyPreserveHost On 
    ProxyPass/http://hostname2:9000/ 
    ProxyPassReverse/http://hostname2:9000/ 
</VirtualHost> 

Teraz przy żądaniu od obu hostname1 lub hostname2, uzyskać natychmiastowy 500 widocznie z powodu mod_proxy nie znajdując wszelkie reguły pasujące do pełnomocnika zgłoszeniu:

[Fri Feb 08 06:41:01 2013] [warn] proxy: No protocol handler was valid for the URL /. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule. 

pamiętać, że Tomcat nie odbiera przychodzące żądania, a więc nie ma wyjścia dziennika

Przez wzgląd na zdrowie psychiczne, sprawdziłem, że rzeczywiście mogą uzyskać dostęp do tych dwóch zasobów indywidualnie w swoich portach, tzn mam dostępu hostname1 użyciu hostname1: 8080 i hostname2 użyciu hostname2: 9000.

Czy brakuje tutaj elementów, aby pomóc mi to poprawnie skonfigurować?

Dodatkowo, czy istnieją lepsze sposoby radzenia sobie z tym w bardziej rozsądny sposób?

Dziękuję za pomoc!

+0

to "nazwa hosta" pełną? Co widzisz w swoich plikach dziennika? Czy coś dostaje się do twoich tomcat logów? –

+0

W pełni kwalifikowany jak w "nazwa.com" (sans "www"), tak. – jerluc

+0

Dodano dzienniki błędów Apache powyżej – jerluc

Odpowiedz

4

Odpowiedź wydawała się być wadliwa konfiguracja dotycząca oddzielnego modułu, mianowicie mod_proxy_http. Doszedłem do następującej ServerFault odpowiedź pomogła mi, jak ostrzeżony przez „proxy: Brak obsługi protokołu było ważne dla URL” komunikatów w dzienniku błędów Apache HTTP: https://serverfault.com/questions/242650/setting-up-a-basic-mod-proxy-virtual-host

+3

Szkoda, że ​​link nie trafia do odpowiedzi, która jest po prostu 'sudo a2enmod proxy_http' - w każdym razie DZIĘKI! – sage

+0

@jerluc: HTML nie jest protokołem, miałeś na myśli 'mod_proxy_http'? –

+1

@Andrew Tak, zrobiłem – jerluc

1

Jeśli chcesz skonfigurować hosty wirtualne oparte na nazwach, dodaj dyrektywę NameVirtualHost.

Dodaj ServerName i DocumentRoot do każdego VirtualHost.

Przykład:

NameVirtualHost *:80 

<VirtualHost *:80> 
ServerName hostname1 
DocumentRoot /www/hostname1 
ProxyPreserveHost On 
ProxyPass/http://hostname1:8080/ 
ProxyPassReverse/http://hostname1:8080/ 
</VirtualHost> 

<VirtualHost *:80> 
    ServerName hostname2 
    DocumentRoot /www/hostname2 
    ProxyPreserveHost On 
    ProxyPass/http://hostname2:9000/ 
    ProxyPassReverse/http://hostname2:9000/ 
</VirtualHost> 
+0

NameVirtualHost jest już ustawiony na taką wartość, przebacz zaniedbanie. ServerName jest również wyraźnie używany w podanej konfiguracji. Ponadto, nie widzę absolutnie żadnego powodu, dla którego DocumentRoot miałby sens, biorąc pod uwagę, że oba hosty są skonfigurowane jako proxy. – jerluc

1

Jeśli masz w dzienniku błędów:

Jeśli używasz wersji mod_proxy DSO, upewnij się, że submoduły proxy są zawarte w konfiguracji przy użyciu modułu LoadModule.

Wykonaj polecenie:

a2enmod proxy_http