代码之家  ›  专栏  ›  技术社区  ›  The Archetypal Paul

使用WebLogic代理和Apache2将HTTPS请求重定向到两个不同的WebLogic服务器

  •  1
  • The Archetypal Paul  · 技术社区  · 15 年前

    我有一个服务器服务器A运行一个WebLogic应用程序App1,端口7001上有基本URL/App1/,另一个服务器B运行一个WebLogic应用程序App2,端口8001上有基本URL/App2/。两台服务器都运行Solaris、Apache2和WebLogic9.2

    (细节已更改,但这些内容具有代表性)

    换句话说,可以在

    http://serverA:7001/app1/

    和APP2

    http://serverB:8001/app2/

    但是,客户要求对应用程序的所有访问都使用从端口443到服务器1的HTTPS。

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

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

    那我该怎么处理呢?

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

    这样行吗?我是否遗漏了其他方法的一些明显之处?

    编辑:我想我可能错过了WebLogic插件可以有几个块,每个块将页面定向到不同的地方。在这种情况下,这变得容易了。

    我明天回去工作的时候测试一下,然后更新问题

    2 回复  |  直到 15 年前
        1
  •  2
  •   Community Mr_and_Mrs_D    7 年前

    首先,必须阅读的资源当然是官方文件: Installing and Configuring the Apache HTTP Server Plug-In (也见) this previous answer 有关WLS 9插件的更多链接)。

    如本节所述 Configuring the Apache HTTP Server Plug-In ,我会定义几个 IfModule ,每个应用程序一个(集群的或非集群的),实际上,还有几个 VirtualHost (包括 IFF模块 )有 an example 在文档中:

    # 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时所需要的,因为您不能使用基于名称的虚拟主机。引用 Why can't I use SSL with name-based/non-IP-based virtual hosts? 从阿帕奇的 SSL/TLS Strong Encryption: FAQ

    原因是技术性很强,而且有点“鸡和蛋”的问题。SSL协议层保持在HTTP协议层的下方,并封装HTTP。当建立SSL连接(https)时,apache/mod_ssl必须与客户机协商ssl协议参数。为此,mod_ssl必须查询虚拟服务器的配置(例如,它必须查找密码套件、服务器证书等)。但是为了找到正确的虚拟服务器,Apache必须知道 Host HTTP头字段。为此,必须读取HTTP请求头。这在完成SSL握手之前无法完成,但需要信息才能完成SSL握手阶段。答对了!

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

        2
  •  1
  •   Kenster marc_s    15 年前

    我对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>