基于主机名的Apache HTTP代理

时间:2013-02-08 14:55:40

标签: apache tomcat configuration webserver

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

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

现在,当从 hostname1 hostname2 请求时,由于mod_proxy找不到任何匹配规则来代理请求,我得到了一个即时500:

[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没有收到传入请求,因此没有日志输出

为了理智,我检查了我确实可以在各自的端口单独访问这两个资源,即我可以使用hostname1:8080和访问 hostname1 hostname2 使用hostname2:9000。

这里是否缺少帮助我正确配置的内容?

此外,有没有更好的方法来管理这个可能更合理的方式?

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

答案似乎是关于单独模块的错误配置,即mod_proxy_http。我来到以下服务器故障的答案帮助了我,因为&#34;代理提示:没有协议处理程序对URL有效#34; Apache HTTP错误日志中的消息:https://serverfault.com/questions/242650/setting-up-a-basic-mod-proxy-virtual-host

答案 1 :(得分: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>

答案 2 :(得分:1)

如果您有错误日志:

  

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

执行以下命令:

a2enmod proxy_http