7

以前,我正确设置了 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>

现在,当从hostname1hostname2请求时,我得到一个即时 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 没有接收传入的请求,因此没有日志输出

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

这里有什么东西可以帮助我正确配置吗?

此外,有没有更好的方法以更理智的方式管理这个问题?

感谢您的任何帮助!

4

3 回答 3

4

答案似乎是关于单独模块的错误配置,即 mod_proxy_http。正如 Apache HTTP 错误日志中的“代理:没有协议处理程序对 URL 有效”消息所提示的那样,我得到了以下 serverfault 答案对我的帮助:https ://serverfault.com/questions/242650/setting-up -a-basic-mod-proxy-virtual-host

于 2013-02-09T20:33:42.203 回答
1

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

ServerName将和添加DocumentRoot到每个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>
于 2013-02-08T21:23:27.643 回答
1

如果您有错误日志:

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

执行此命令:

a2enmod proxy_http
于 2014-04-18T12:49:35.953 回答