1

我有一个服务器 serverA 运行 weblogic 应用程序 App1,基本 url /app1/ 在端口 7001 上,另一个服务器 serverB,运行 weblogic 应用程序 App2,基本 url /app2/ 在端口 8001 上。两个服务器都运行 Solaris、Apache2 和 Weblogic 9.2

(细节有所改变,但这些具有代表性)

换句话说,app1 可以在

http://serverA:7001/app1/

和app2

http://serverB:8001/app2/

但是,客户要求对应用程序的所有访问都在 server1 的端口 443 上使用 https。

如果只有一个应用程序,我可以使用虚拟主机并将以 /app1/ 开头的 URL 的处理程序设置为 Weblogic 代理,该代理会将它们转发到端口 7001 上的服务器 1。

有两个应用程序,我需要另一个虚拟主机,它的另一个 Location 语句匹配 /app2/ 并转发到端口 8001 上的当前服务器......但我不明白这是如何工作的,因为第一个虚拟主机将完成 SSL协商来确定 URL,而当事情落到第二个虚拟服务器上时,Apache 可能无法做到这一点。

那么我该如何处理呢?

我目前的想法是将到达 server1 的所有 SSL 请求代理到端口 80 上的同一服务器 server1(因此基本上只是进行 SSL 终止),然后以上述方式为 /app1/ 和 /app2/ URL 添加两个虚拟主机.

这行得通吗?我是否错过了一些关于其他方法的明显内容?

编辑:我想我可能错过了 Weblogic 插件可以有几个块,每个块将页面引导到不同的位置。在这种情况下,这变得容易。

我明天上班时测试并更新问题

4

2 回答 2

2

首先,必须阅读的资源当然是官方文档:安装和配置 Apache HTTP Server 插件(有关 WLS 9 插件的更多链接,另请参见之前的答案)。

正如配置 Apache HTTP Server 插件一节中详述的那样,我定义了几个IfModule,一个为每个应用程序(集群或非集群),实际上,几个VirtualHost(可以包括IfModule)。文档中有一个示例

# VirtualHost1 = localhost:80
<VirtualHost 127.0.0.1:80>
  DocumentRoot "C:/test/VirtualHost1"
  ServerName localhost:80 <IfModule mod_weblogic.c> 
  #... WLS parameter ...
  WebLogicCluster localhost:7101,localhost:7201
  # Example: MatchExpression *.jsp <some additional parameter>
  MatchExpression *.jsp PathPrepend=/test2
  </IfModule>
</VirtualHost>

# VirtualHost2 = 127.0.0.2:80
<VirtualHost 127.0.0.2:80>
  DocumentRoot "C:/test/VirtualHost1"
  ServerName 127.0.0.2:80
  <IfModule mod_weblogic.c> 
  #... WLS parameter ...
  WebLogicCluster localhost:7101,localhost:7201
  # Example: MatchExpression *.jsp <some additional parameter>
  MatchExpression *.jsp PathPrepend=/test2
  #... WLS parameter ...
  </IfModule>
</VirtualHost>    <IfModule mod_weblogic.c>

请注意,这是基于多个 IP 的虚拟主机配置(而不是文档中所述的基于名称的配置)。但这实际上很好,因为这正是您在使用 SSL 时所需要的,因为您不能使用基于名称的虚拟主机。引用为什么我不能将 SSL 与基于名称/非基于 IP 的虚拟主机一起使用?来自 Apache 的SSL/TLS 强加密:FAQ

原因是非常技术性的,有点“鸡和蛋”的问题。SSL 协议层位于 HTTP 协议层之下并封装了 HTTP。当建立 SSL 连接 (HTTPS) 时,Apache/mod_ssl 必须与客户端协商 SSL 协议参数。为此,mod_ssl 必须查阅虚拟服务器的配置(例如,它必须查找密码套件、服务器证书等)。但是为了访问正确的虚拟服务器,Apache 必须知道HostHTTP 标头字段。为此,必须读取 HTTP 请求标头。这不能在 SSL 握手完成之前完成,但需要该信息才能完成 SSL 握手阶段。答对了!

因此,在上面的示例中,修改虚拟主机 IP 地址和端口,ServerName调整 IfModule 以满足您的需要(并设置 DNS 条目以指向 IP),然后就可以了。

于 2010-01-19T22:59:50.580 回答
1

我对 weblogic 没有任何经验,所以也许我错过了一些重要的东西。但这听起来像是 apache 反向代理功能的简单应用。设置一个服务于 https 的 apache 实例,并配置两个位置如下:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

<Location /app1>
    ProxyPass http://serverA:7001/app1
    ProxyPassReverse http://serverA:7001/app1
</Location>
<Location /app2>
    ProxyPass http://serverB:8001/app2
    ProxyPassReverse http://serverB:8001/app2
</Location>
于 2010-01-19T19:14:24.403 回答