如何使用 Apache 代理 Weblogic 集群上的单页应用程序

How to Use Apache to Proxy to Single Page Application on Weblogic Cluster

作为升级遗留 Java 应用程序(托管在 Weblogic 集群上)的一部分,此应用程序的一部分将被单页应用程序 (REACT) 取代,通过 API 调用到包含迁移后端功能的各种服务。目前,直到所有 UI 依赖项都从遗留应用程序中移植出来,REACT SPA 仍将托管在 JSP 页面中(一些常见的 JSP 代码尚未移植,因此将出现在托管 React 应用程序的 JSP 页面上。

托管此设置的基础结构当前是 Apache 服务器,根据需要路由到 Weblogic 集群或更新的服务。之前代理到 weblogic 集群很简单,因为所有 *.jsp 页面都通过一个简单的 weblogic 插件块路由到集群:

 <IfModule mod_weblogic.c>
   WebLogicCluster server1:port,server2:port
   MatchExpression  *.jsp
 </IfModule>

但是对于新的 SPA,我还需要一整套路由来代理到包含我的 SPA 的单个 .jsp 页面。如果我的目标只是通过路径代理,我可以使用 apache weblogic 插件轻松解决:

 <Location /newSection/>
   WLSRequest On
   WebLogicCluster server1:port,server2:port
   PathTrim /newSection/
   PathPrepend SPA.jsp
   DefaultFileName SPA.jsp
 </Location>

然而,这仅适用于基础 /newSection/ url,作为 url like

http://host/newSection/spa-route

被代理到

http://host/SPA.jsp/spa-route

这显然是无效的。

我为 weblogic 插件尝试的 PathTrim、PathPrepend 或其他任何东西都无法解决我试图通过路径代理到单个 URI 的问题(一切都需要代理到 http://host/SPA.jsp,SPA 路由器处理其余部分)

我目前正在尝试仅使用 mod_rewrite 和 mod_proxy,因为 RewriteRule [P] 允许我代理到集群上的单个 URI(来自代理平衡器的集群 IP)。然而,这设置起来要复杂得多(仍在尝试),我必须自己实现诸如会话粘性之类的东西。

关于如何使用 mod_weblogic 插件代理到特定 URI 的解决方案会很棒,但是如何使用 mod_rewrite、mod_proxy、[=33= 的示例] mod_proxy_balancer 在 weblogic 集群上实现对单个 URI 的代理也将非常有帮助。

原来有一个 apache 功能(直通)我不知道(或者至少它是如何工作的)可以很好地将 Apache 重写规则桥接到 weblogic 插件。

RewriteRule /newSection/.*$ /SPA.jsp  [PT,L]

直通将 URI 重写为 http://host/SPA.jsp 而不进行重写。然后,passthrough 通过规则堆栈和其他模块显式地将新 URI 传回。在这一点上,原始的 weblogic 插件规则我通过 MIME 类型代理到集群 (*.jsp) 将获取 URI 并很好地工作。

这样 Apache 负责将一组路径重写到特定 URI,而 weblogic 插件很好地处理其余部分(代理到集群、负载平衡、粘性会话等)

以下是您如何使用 weblogic 插件来定向单个 url,请根据您的要求随意更改选项:

创建虚拟主机文件:

<VirtualHost *:80>
        SSLEngine on
        ServerName fqdn
        ServerAlias alias
        ServerAdmin webmaster@localhost
        Header always append X-Frame-Options DENY
        DocumentRoot /var/apache2/htdocs

        <Directory /var/apache2/htdocs>
            Options -Indexes +FollowSymLinks
            AllowOverride None
            Require all granted
        </Directory>

<IfModule mod_weblogic.c>
    debug ERR
    FileCaching on
    WLIOTimeoutSecs 600
    Idempotent ON
    FileCaching ON
    DynamicServerList ON
    KeepAliveEnabled OFF

<Location /newsection>
        SetHandler weblogic-handler
        WebLogicCluster host1:port,host2:port
</Location>
<Location /newsection/SPA.jsp>
        SetHandler weblogic-handler
        WebLogicCluster host3:port,host4:port
</Location>
<Location /SPA.jsp>
        SetHandler weblogic-handler
        WebLogicCluster host5:port,host6:port
</Location>

</IfModule>
</VirtualHost>