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

Apache 将两个域路由到同一JBoss实例,apache,jboss,mod-jk,Apache,Jboss,Mod Jk,我有两个指向硬件负载均衡器的公共网站(foo.com和bar.com)。此硬件将流量转发到我的服务器,如下所示: <VirtualHost *:7700> DocumentRoot "/htdocs/foo.com" ServerName foo.com </VirtualHost> <VirtualHost *:7701> DocumentRoot "/htdocs/foo.com" ServerName foo.com

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

<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>
==>端口7700
==>端口7701

==>端口7800
==>端口7801

我的服务器目前是一个旧的iPlanet框,它定义了两个虚拟服务器(对于77007701,为foo.com;对于78007801,为bar.com)。由于负载平衡器直接转发到这些端口,因此一切正常

我现在需要将这些网站移植到Apache2.2+JBoss6.0配置中,而我目前还不知道实现这一点的最佳实践是什么

我已经将Apache设置为在我的四个端口(7700770178007801)上侦听,并为77017801配置了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>

DocumentRoot“/htdocs/foo.com”
ServerName foo.com
DocumentRoot“/htdocs/foo.com”
ServerName foo.com
斯伦金安
SSLCipherSuite全部:。。。
SSLCertificateFile“/cert/foo.com.crt”
SSLCertificateKeyFile“/cert/foo.com.key”
DocumentRoot“/htdocs/bar.com”
ServerName bar.com
DocumentRoot“/htdocs/bar.com”
ServerName bar.com
斯伦金安
SSLCipherSuite全部:。。。
SSLCertificateFile“/cert/bar.com.crt”
SSLCertificateKeyFile“/cert/bar.com.key”
我已经用静态内容对此进行了测试,HTTP和HTTPS连接都正常工作

对于我的JBoss配置,我目前将应用程序部署为/foo和/bar,尽管我不知道这是否应该是最终配置。我想做到的是:

将所有流量从7700/7701转发到,并从7800/7801转发到。不过,我不想在公共URL中看到/foo和/bar,用户应该只看到


有没有办法将mod_jk配置为将请求转发到特定的URL?或者我应该想办法让JBoss主机foo.com在端口A上,bar.com在端口B上——然后让mod_jk分别转发到每个端口?

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

我还想建议您看一看-它可能有额外的功能,这将有助于这一点

编辑

啊。经过你的澄清(以及更好的挖掘),我认为可能会有不同的答案。我目前正在使用
ProxyPass
/
ProxyPassReverse
将顶级URL重定向到各个servlet。我又看了一遍,我想如果你把它和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> 
listen7700
听7701
听7800
听7801
代理主机
ProxyPass/http://localhost:8080/foo
ProxyPassReverse/http://localhost:8080/foo
ServerName foo.com
代理主机
ProxyPass/http://localhost:8080/foo
ProxyPassReverse/http://localhost:8080/foo
ServerName foo.com
斯伦金安
SSLCipherSuite全部:。。。
SSLCertificateFile“/cert/foo.com.crt”
SSLCertificateKeyFile“/cert/foo.com.key”
代理主机
ProxyPass/http://localhost:8080/foo
ProxyPassReverse/http://localhost:8080/foo
ServerName bar.com
代理主机
ProxyPass/http://localhost:8080/foo
ProxyPassReverse/http://localhost:8080/foo
ServerName bar.com
斯伦金安
SSLCipherSuite全部:。。。
SSLCertificateFile“/cert/bar.com.crt”
SSLCertificateKeyFile“/cert/bar.com.key”

我很抱歉第一次错过了这个。您唯一需要测试的是确保servlet访问的URL是正确的。我使用的模式是
http://{host}:{port}/{WARName}/{ServletPath}
。如果已经使用静态内容测试了配置,则只需要添加/调整代理设置。我不确定你是否需要
倾听
语句;我想您会的,因为您的端口是非标准的。

我不确定URL重写是否有效。我认为问题在于,我找不到一种方法,让JBoss在7700端口监听,为foo.war提供内容,在7800端口监听,为bar.war提供内容。我觉得非常奇怪,JBoss实际上会在多个端口上侦听,但不允许我指定每个端口上提供的内容。@Fibber-我根据您的评论更新了我的答案;我想你帮我找到了一个更简单的潜在解决方案。非常感谢你——这就成功了!我必须对ProxyPass和ProxyPassReverse语句进行一个小的调整,以使其正常工作:我在servlet名称中添加了一个尾随斜杠——即localhost:8080/foo/——如果没有它,JBoss将查找URI/foo:)