![反向代理和请求 URL 感知 tomcat](https://linux22.com/image/633107/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%92%8C%E8%AF%B7%E6%B1%82%20URL%20%E6%84%9F%E7%9F%A5%20tomcat.png)
我配置了一个基础结构设置,其中 apache 反向代理终止 SSL 请求。然后,请求被代理到另一个前端 apache web 服务器,然后该服务器再次通过 mod_jk/AJP 连接到 tomcat。设置似乎运行顺利,没有一个例外。tomcat 提供 WSDL web 服务,在这些 XML 文件中,一个标签包含主机位置,该位置应与请求的 URL 相同。
由于当前设置,主机位置代表(ajp 连接的)前端 Web 服务器的内部 URL,而不是请求的外部 URL。解决此问题的第一次尝试是将外部 URL 设置为 tomcats server.xml 中的代理 URL,但此方法无法识别 HTTP 或 HTTPS 请求。我必须确定一个。
此外,目前还可以通过其他前端服务器使用完全不同的 URL 来访问这些服务(无需反向代理的更简单的设置)。
我希望我已经描述了我的问题,让大家可以理解。我怎样才能让 tomcat 知道所请求的 URL,或者我应该将所请求的 URL 传递给前端 apache?我现在有点不知所措。
提前致谢。
/编辑
请求序列的简要概述:
**customerX** -- REQUEST HTTP|HTTPS -- **host.external/customerX** -- PASS HTTP -- **customerX.internal** -- AJP -- **tomcat**
ProxyPreserveHost 开启不起作用,因为它将 host.external 传递给前端 apache,并且没有与该虚拟主机匹配的虚拟主机,从而导致 404 错误 - 不言自明。
配置一点也不特别。外部可访问的反向代理有 2 个虚拟主机 (HTTP|HTTPS)。两个虚拟主机都知道我们通过上下文 /customerX、/customerY 等为每位客户提供服务。例如 HTTP 虚拟主机:
<VirtualHost *:80>
ServerName host.external
ProxyPass /customerX http://customerX.internal
ProxyPassReverse /customerX http://customerX.internal
ProxyPass /customerY http://customerY.internal
ProxyPassReverse /customerY http://customerY.internal
...
</VirtualHost>
我知道,第二行是隐含的。
在第二个 apache 上,每个客户都有一个虚拟主机(仅 HTTP),具有相应的服务器名称和 tomcats webapps 必要的 JkMounts:
<VirtualHost *:80>
ServerName customerX.internal
JkMount ...
</VirtualHost>