2013-02-08 81 views
7

以前,我正确设置了Apache HTTP以将端口80上的传入HTTP请求转发到运行在端口8080上的Tomcat实例。但是,现在我处于这种情况,我需要能够将端口80上的传入请求代理到Tomcat @ 8080或不同的进程@ 9000,具体取决于主机名。下面是我在设置我的Apache配置试图处理这种情况的一个片段:基于主机名的Apache HTTP代理

<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> 

现在无论从主机名1主机名2请求的时候,我得到即时的500显然是由于mod_proxy的找不到任何匹配规则代理请求:

[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. 

注意,Tomcat没有接收到传入的请求,因此没有日志输出

对于理智的缘故,我检查,我确实可以单独在各自的港口,即访问这两种资源,我可以使用主机名1访问主机名1:8080 主机名2使用主机名2:9000。

有没有什么东西在这里丢失,以帮助我正确配置?

此外,有没有更好的方式来管理这可能是一种更理智的方式?

谢谢你的帮助!

+0

是你的 “主机名” 完全合格的?另外,你在日志文件中看到了什么?有什么东西进入你的Tomcat日志? – 2013-02-08 14:59:56

+0

完全符合“name.com”(无“www”),是的。 – jerluc 2013-02-08 15:01:37

+0

在 – jerluc 2013-02-08 15:03:24

回答

4

答案似乎是错误的配置关于一个单独的模块,即mod_proxy_http。我来到了以下serverfault答案帮助我,由通风报信“代理:无协议处理程序是有效的URL”的消息在Apache HTTP错误日志:https://serverfault.com/questions/242650/setting-up-a-basic-mod-proxy-virtual-host

+3

太糟糕了,链接不能回答,只是'sudo a2enmod proxy_http' - 无论如何,谢谢! – sage 2013-07-20 22:35:05

+0

@jerluc:HTML不是协议,你的意思是'mod_proxy_http'? – 2013-12-11 22:53:22

+1

@Andrew是的,我做到了 – jerluc 2013-12-12 01:42:13

1

如果要配置基于名称的虚拟主机,请添加NameVirtualHost指令。

ServerNameDocumentRoot分别加上VirtualHost

实施例:

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已经设置为这样的值,请原谅遗漏。 ServerName也明确地用于我提供的配置中。另外,我认为DocumentRoot完全没有理由,因为两个主机都被设置为代理。 – jerluc 2013-02-09 19:21:13

1

如果你在错误日志:

如果您使用的是mod_proxy的DSO版本,请确保代理 子模块包含在使用LoadModule的配置中。

执行此命令:

a2enmod proxy_http