Apache 将两个域路由到同一JBoss实例
我有两个指向硬件负载均衡器的公共网站(foo.com和bar.com)。此硬件将流量转发到我的服务器,如下所示: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
<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:)