我正在尝试实施浏览器客户端 -> Apache2 代理 -> Tomcat 应用服务器方案。Apache2 和 Tomcat 位于不同的服务器上。但代理无法按我预期的方式工作。Apache2 虚拟主机设置:
<VirtualHost *:80 *:443>
ServerName example.com
ServerAlias www.example.com
ProxyPass /MyApp http://tomcatdomain.com/MyApp
ProxyPassReverse /MyApp tomcatdomain.com/MyApp
</VirtualHost>
如果我请求在浏览器中打开页面,http://example.com/MyApp,应用程序正确打开,但 URL 不同 -http://tomcatdomain.com/MyApp接下来,我查看了 Ajax 请求,发现它并没有按照我预期的方案运行:
12:35:20.537 GET https://example.com/MyApp/service/test [HTTP/1.1 302 41ms]
12:35:20.617 GET https://tomcatdomain.com/MyApp/service/test
预期:[请求] 客户端->apache2->tomcat [响应] tomcat->apache2->客户端
实际上是: [请求] 客户端->apache2 [响应] apache2->客户端 [请求2] 客户端 ->tomcat [响应2] tomcat -> 客户端
我的第一个问题是如何让客户端通过一个查询收到来自 tomkat 的响应?
ProxyPreserveHost 参数的下一个问题是 - 打开应用程序时我需要保留原始 url(example.com)(而不是 tomcatdomain.com)。我将 ProxyPreserveHost 附加到 appache2 设置:
<VirtualHost *:80 *:443>
ServerName example.com
ServerAlias www.example.com
ProxyPreserveHost On
ProxyPass /MyApp http://tomcatdomain.com/MyApp
ProxyPassReverse /MyApp tomcatdomain.com/MyApp
</VirtualHost>
我还准备了tomkat server.xml:
<Host name="example.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Alias>www.example.com</Alias>
<Context path="" docBase="MyApp"/>
</Host>
我发出一个请求并在浏览器中看到以下内容:
该页面未正确重定向 Firefox 检测到服务器正在以永远无法完成的方式重定向此地址的请求。
我发出 AJAX 请求,但看到 22 个相同的请求没有得到答复:
12:54:48.020 GET https://example.com/MyApp/service/test [HTTP/1.1 302 28ms]
12:54:48.042 GET https://example.com/MyApp/service/test [HTTP/1.1 302 4ms]
... 22 requests!
12:54:48.367 GET https://example.com/MyApp/service/test [HTTP/1.1 302 3ms]
我得出的结论是请求没有重定向到tomcat服务器。
为了证实我的猜测,我修正了 Apache2 设置:
<VirtualHost *:80 *:443>
ServerName example.com
ServerAlias www.example.com
ProxyPreserveHost On
ProxyPass /MyApp http://tomcatdomain.com/MyApp**ABCD**
ProxyPassReverse /MyApp tomcatdomain.com/MyApp**ABCD**
</VirtualHost>
在浏览器中我看到:未找到请求的 URL /MyAppABCD 未在此服务器上找到。Apache/2.4.27 (Ubuntu) 服务器位于 example.com 端口 80
Apache2搜索URL映射不是在tomcat上,而是在同一个apache2上?
请告诉我,如何实现该方案,当浏览器打开页面时,将通过 Apache2 代理从 Tomcat 接收数据,并保存原始 URL?谢谢。
答案1
问题出在 Apache2 和 Tomcat 上的自签名证书上。需要进行交叉认证。如果您删除 Apache2 和 Tomcat(不是!WWW 和 Apache2)之间的加密(SSL 或 TLS),则无需进行其他设置。