Webapp 无法使用代理

Webapp 无法使用代理

在我用来演示系统的单台服务器上,我有一个在 apache2 上运行的静态网站和一个在 tomcat 实例上运行的演示 Web 应用程序。直接访问时,两者都运行良好。我设置了一个代理来将 Web 应用程序端口和混乱的 URL 转换为简单的 URL,但我得到的结果不一致。

服务器是带有 Apache2 的 Digital Ocean Ubuntu 18.04 droplet。我的主要网站使用 Drupal 并具有标准 URL。Webhttps://example.com应用程序是一个由 Tomcat7 提供服务的大型企业系统,可通过以下方式访问:https://example.com:4444/webui/

目标是访问 的网络应用程序https://example.com/my_demo

代理在 apache2 虚拟主机中以标准方式定义

ProxyPass "/webui" "https://example.com:4444/webui/"
ProxyPassReverse "/my_demo" "https://example.com:4444/"

并且 tomcat 应用程序在 server.xml 中有一个代理条目

<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
        port="4444" maxThreads="200"
        scheme="https" secure="true" SSLEnabled="true"
        keystoreFile="/opt/webapp/keystore/webappKeystore" keystorePass="redactedPassword"
        clientAuth="false" sslProtocol="TLS"
        proxyName="example.com"
        proxyPort="443"/>

这种方法似乎可行,但效果还不够好。

我遇到的问题是,Web 应用程序无法始终使用代理。它是用 ZK 编写的,并且混合了使用应用程序上下文路径(例如“/webui/images/theimage.jpg”)的资源引用,以及使用 ZK 桌面上下文(最终可能发送“images/theimage.jpg”)的资源引用。因此,Web 应用程序似乎在某些地方缺少按钮图像,但在其他地方则没有。

此外,在注销时,webapp 会将浏览器重定向回 tomcat 地址,但链接已损坏,最终显示为 /webui/index,并出现 403 错误,而不是 /webui/index.zul,就好像它被错误地重写了一样。

同样,当从 tomcat 服务器运行时无需通过代理,Web 应用程序就可以正常运行。

我正在寻找有关如何调试此问题并让 tomcat web 应用程序在代理下工作的建议。我尝试使用 dump_io 和重写日志,但除了上述问题之外,找不到错误发生的位置。

我还应该检查其他元素吗?

任何建议,将不胜感激。

答案1

您的问题归结为重写来自应用服务器的绝对请求 URI。这可以通过两种方式完成:

  1. Apache2 可以重写代理内容中的所有 URI。捕获 URI 可能出现的所有位置相当困难。
  2. Tomcat7可以使用与Apache服务器相同的绝对请求URI。

我建议采用第二种方法,因为这是最简单的方法。你应该:

  1. 将 Web 应用程序部署在/my_demo而不是 上/webui。这可能就像在 中重命名webapps/webui为一样简单。webapps/my_demoCATALINA_BASE
  2. 配置 Apache 代理/my_demo/https://example.com:4444/my_demo/

    ProxyPass "/my_demo/" "https://example.com:4444/my_demo/"
    ProxyPassReverse "/my_demo/" "https://example.com:4444/my_demo/"
    

附言:在我看来,对 Tomcat 使用 HTTPS 有点小题大做,只需配置一个 HTTP 连接器并更改securescheme属性,这样 Tomcat 就知道它是通过 HTTPS 代理的:

<Connector port="4444"
           scheme="https" secure="true"
           proxyName="example.com"
           proxyPort="443"/>

并在指令中更改https为。httpProxyPass

相关内容