2012-05-07 52 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