2010-09-08 99 views
0

我有兩個公共網站(foo.com和bar.com)指向一個硬件負載平衡器。這種硬件的流量轉發到我的服務器如下:將兩個域路由到相同的JBoss實例

http://foo.com ==>端口7700
https://foo.com ==>端口7701

http://bar.com ==>端口7800
https://bar.com ==>端口7801

我的服務器目前是舊的iPlanet盒子它定義了兩臺虛擬服務器(foo.com for 7700,7701和bar.com for 7800,7801)。由於負載均衡器直接轉發到這些端口,所以一切正常。

我現在需要將這些網站移植到Apache 2.2 + JBoss 6.0配置中,而且我目前對最佳實踐完成這一任務感到不知所措。

我已經設置了Apache來監聽我的四個端口(7700,7701,7800,7801)併爲7701,7801配置了SSL。我假設最好讓Apache處理SSL握手和連接。我已經在Apache中設置4個虛擬主機條目,如下所示:

<VirtualHost *:7700> 
    DocumentRoot "/htdocs/foo.com" 
    ServerName foo.com 
</VirtualHost> 
<VirtualHost *:7701> 
    DocumentRoot "/htdocs/foo.com" 
    ServerName foo.com 
    SSLEngine on 
    SSLCipherSuite ALL:... 
    SSLCertificateFile "/cert/foo.com.crt" 
    SSLCertificateKeyFile "/cert/foo.com.key" 
</VirtualHost> 

<VirtualHost *:7800> 
    DocumentRoot "/htdocs/bar.com" 
    ServerName bar.com 
</VirtualHost> 
<VirtualHost *:7801> 
    DocumentRoot "/htdocs/bar.com" 
    ServerName bar.com 
    SSLEngine on 
    SSLCipherSuite ALL:... 
    SSLCertificateFile "/cert/bar.com.crt" 
    SSLCertificateKeyFile "/cert/bar.com.key" 
</VirtualHost> 

我和靜態內容進行了測試,HTTP和HTTPS連接工作正常。

對於我的JBoss配置,我目前已將我的應用程序部署爲/ foo和/ bar,儘管我不知道這應該是最終配置。我想做到的是:

轉發所有流量從七千七百零一分之七千七百到http://localhost:8080/foo,並從7801分之7800到http://localhost:8080/bar。我不想在公共URL中看到/ foo和/ bar,但用戶應該只看到http://www.foo.comhttp://www.bar.com

有沒有辦法配置mod_jk將請求轉發到特定的URL?或者我應該考慮如何讓JBoss主機foo.com在端口B上的端口A和bar.com上運行 - 並且只需將mod_jk分別轉發到每個端口?

回答

0

我認爲mod_jk結合URL重寫應該處理你所需要的。有關worker的mod_jk信息表明您應該能夠使用mod_jk使用uriworkermap根據URL轉發請求。還提到你可以爲每個虛擬主機分配一個uriworkermap。

我還想建議你看看mod_cluster - 它可能有其他功能可以幫助解決這個問題。

編輯

哎呀。澄清之後(還有一些更好的挖掘),我想可能有不同的答案。我目前使用ProxyPass/ProxyPassReverse將頂級URL重定向到單個servlet。我已經重新審查了Apache VirtualHost docs,我認爲如果你將它與mod_proxy結合起來,你將能夠得到你想要的。

下面是建立在我有什麼,能滿足您的要求提出的配置例如:

Listen 7700 
Listen 7701 
Listen 7800 
Listen 7801 

<VirtualHost *:7700> 
    ProxyPreserveHost On 
    ProxyPass/http://localhost:8080/foo 
    ProxyPassReverse/http://localhost:8080/foo 
    ServerName foo.com 
</VirtualHost> 

<VirtualHost *:7701> 
    ProxyPreserveHost On 
    ProxyPass/http://localhost:8080/foo 
    ProxyPassReverse/http://localhost:8080/foo 
    ServerName foo.com 
    SSLEngine on 
    SSLCipherSuite ALL:... 
    SSLCertificateFile "/cert/foo.com.crt" 
    SSLCertificateKeyFile "/cert/foo.com.key" 
</VirtualHost> 

<VirtualHost *:7800> 
    ProxyPreserveHost On 
    ProxyPass/http://localhost:8080/foo 
    ProxyPassReverse/http://localhost:8080/foo 
    ServerName bar.com 
</VirtualHost> 

<VirtualHost *:7801> 
    ProxyPreserveHost On 
    ProxyPass/http://localhost:8080/foo 
    ProxyPassReverse/http://localhost:8080/foo 
    ServerName bar.com 
    SSLEngine on 
    SSLCipherSuite ALL:... 
    SSLCertificateFile "/cert/bar.com.crt" 
    SSLCertificateKeyFile "/cert/bar.com.key" 
</VirtualHost> 

我爲此錯過了第一次道歉。你唯一想測試的就是確保servlet訪問的URL是正確的。我使用的模式是http://{host}:{port}/{WARName}/{ServletPath}。如果您已經使用靜態內容測試了配置,則只需要添加/調整代理設置即可。我不確定您是否需要Listen聲明;我想你會的,因爲你的港口是非標準的。

+0

我不確定URL重寫是否有效。我認爲問題在於我無法找到一種方法讓JBoss在端口7700上偵聽爲foo.war提供內容,並在端口7800上偵聽爲bar.war提供內容。我發現JBoss真的會在多個端口上偵聽,但不允許我指定每個端口上的內容。 – 2010-09-08 20:51:53

+0

@Fibber - 我根據你的評論更新了我的答案;我認爲你幫助我找到了一個更簡單的潛在解決方案。 – mlschechter 2010-09-09 02:02:31

+0

非常感謝 - 這個訣竅!我必須對ProxyPass和ProxyPassReverse語句進行一些小調整才能正常工作:我在servlet名稱後加了一個斜槓 - 即localhost:8080/foo/- 沒有它,JBoss查找/ foofoo的URI: ) – 2010-09-09 05:02:23

相關問題