将两个域路由到同一个JBoss实例

时间:2010-09-08 01:32:51

标签: apache jboss mod-jk

我有两个指向硬件负载均衡器的公共网站(foo.com和bar.com)。此硬件将流量转发到我的服务器,如下所示:

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

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

我的服务器目前是一个旧的iPlanet盒,它定义了两个虚拟服务器(foo.com为7700,7701,bar.com为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,但我不知道这是否应该是最终配置。我想要完成的是:

将所有流量从7700/7701转发到 http://localhost:8080/foo ,从7800/7801转发到 http://localhost:8080/bar 。我不想在公共网址中看到/ foo和/ bar - 用户应该只看到 http://www.foo.com http://www.bar.com

有没有办法配置mod_jk来将请求转发到特定的URL?或者我应该考虑如何让JBoss在端口A上托管foo.com,在端口B上托管bar.com - 并且只需将mod_jk分别转发到每个端口?

1 个答案:

答案 0 :(得分:0)

我认为mod_jk结合网址重写应该能够满足您的需求。有关工作人员的mod_jk信息表明您应该能够使用mod_jk使用uriworkermap基于URL转发请求。还提到您可以为每个虚拟主机提供单独的uriworkermap。

我还建议你看看mod_cluster - 它可能有其他功能可以帮助解决这个问题。

修改

哎呀。在您澄清之后(以及一些更好的挖掘),我认为可能会有不同的答案。我目前正在使用ProxyPass / ProxyPassReverse将顶级网址重定向到各个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陈述;我想你会,因为你的端口是非标准的。