在我用来演示系统的单台服务器上,我有一个在 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。这可以通过两种方式完成:
- Apache2 可以重写代理内容中的所有 URI。捕获 URI 可能出现的所有位置相当困难。
- Tomcat7可以使用与Apache服务器相同的绝对请求URI。
我建议采用第二种方法,因为这是最简单的方法。你应该:
- 将 Web 应用程序部署在
/my_demo
而不是 上/webui
。这可能就像在 中重命名webapps/webui
为一样简单。webapps/my_demo
CATALINA_BASE
配置 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 连接器并更改secure
和scheme
属性,这样 Tomcat 就知道它是通过 HTTPS 代理的:
<Connector port="4444"
scheme="https" secure="true"
proxyName="example.com"
proxyPort="443"/>
并在指令中更改https
为。http
ProxyPass