以前,我已正确设置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。
这里是否缺少帮助我正确配置的内容?
此外,有没有更好的方法来管理这个可能更合理的方式?
感谢您的帮助!
答案 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
指令。
将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>
答案 2 :(得分:1)
如果您有错误日志:
如果您使用的是DSO版本的mod_proxy,请确保代理 子模块使用LoadModule包含在配置中。
执行以下命令:
a2enmod proxy_http