2012-05-07 51 views
1

我通过ajp协议连接到两个tomcat应用程序。这两个文件都在ROOT.war的独立tomcat虚拟主机上运行。 在服务器上,我已经配置了/ etc/hosts文件使用ajp协议连接到备用备用主机别名

127.0.0.1  localhost tcvh1 tcvh2 

的Apache httpd.conf:

Listen 80 
NameVirtualHost *:80 

<VirtualHost *:80> 
     #ProxyPreserveHost On 
     ServerName app1.example.com 
     ProxyPass/ajp://tcvh1:8082/ 
     ProxyPassReverse/ajp://tcvh1:8082/ 

</VirtualHost> 

<VirtualHost *:80> 
     #ProxyPreserveHost On 
     ServerName app2.example.com 
     ProxyPass/ajp://tcvh2:8082/ 
     ProxyPassReverse/ajp://tcvh2:8082/ 
</VirtualHost> 

的Tomcat:

我有应用程序部署为: APP1 - $ CATALINA_HOME/tcvh1/ROOT.war APP 2 - $ CATALINA_HOME/tcvh2/ROOT.war

现在, 如果我改变了对Tomcat的端口8080上运行,并改变了代理通过连接到http://tcvh1:8080,然后它工作。但如果我用AJP配置,它不起作用

为什么我的主机别名不适用于AJP?有没有办法让它工作?

+0

你正在运行两个tomcat实例吗?因为如果是这种情况,它看起来像你试图为他们使用端口8082,这是行不通的(只有一个应用程序可以监听给定的端口)。你需要有一个tomcat实例在不同的端口上侦听,并根据需要更新你的配置。 – larsks

+0

@larsks OP没有运行两个Tomcat实例。 OP正在使用虚拟主机。请参阅http://tomcat.apache.org/tomcat-7.0-doc/virtual-hosting-howto.html –

+0

我不完全清楚“这两个都在单独的tomcat虚拟主机中运行”是否他的意思是两个实例在Apache中使用虚拟托管)或者在Tomcat中使用虚拟托管的单个实例。听起来就像你在上面。 – larsks

回答

2

它不起作用,因为mod_proxy_ajp总是将httpd收到的主机头传递给Tomcat,而mod_proxy_http将使用ProxyPass中定义的主机,除非ProxyPreserveHost设置为On。

因为 - 就httpd而言 - 你的虚拟主机是app1.example.com和app2.example.com,这些是传递给你的Tomcat实例的东西。 Tomcat没有这些虚拟主机的记录。它有tcvh1和tcvh2。因此,所有的请求都会被路由到默认的虚拟主机(在server.xml中的引擎元素上定义了这个主机)。

有几种方法来解决这个问题:

  1. 重命名你的Tomcat虚拟主机匹配你的httpd虚拟主机
  2. 添加别名(见http://tomcat.apache.org/tomcat-7.0-doc/config/host.html#Host_Name_Aliases)到Tomcat虚拟主机。

就我个人而言,我会选择2.更快,更简单。

+0

是的!谢谢!我一直在寻找这一整天。 – NjPx