0

我有两个指向硬件负载平衡器的公共网站(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。不过,我不想在公共 URL 中看到 /foo 和 /bar - 用户应该只看到http://www.foo.comhttp://www.bar.com

有没有办法配置 mod_jk 将请求转发到特定的 URL?或者我应该寻找在端口 A 上让 JBoss 主机 foo.com 和在端口 B 上的 bar.com 的方法——并且只让 mod_jk 分别转发到每个端口?

4

1 回答 1

0

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

我还想建议您看一下mod_cluster-它可能具有有助于解决此问题的其他功能。

编辑

啊。在您澄清(以及一些更好的挖掘)之后,我认为可能会有不同的答案。我目前正在使用ProxyPass/ProxyPassReverse将顶级 URL 重定向到单个 servlet。我再次查看了Apache VirtualHost 文档,我认为如果你将它与 结合起来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陈述;我想你会的,因为你的端口是非标准的。

于 2010-09-08T02:11:24.277 回答