我正在尝试使用 Apache mod_proxy 和 Tomcat 设置负载均衡器。我有以下可用模块 (mod_proxy、mod_proxy_balancer、mod_proxy_http) 我有 2 个 Tomcat 实例,计划将请求路由到其中一个 Tomcat 服务器。
当我直接访问时,Tomcat 上的应用程序运行良好。www.mydomain:8080/myapp www.mydomain:9080/myapp
我的 Tomcat server.xml 具有以下 Tomcat 1 引擎名称="Catalina" defaultHost="localhost" jvmRoute="tomcat1"
Tomcat 2 引擎名称="Catalina" defaultHost="localhost" jvmRoute="tomcat2"
这是我在 virtualhost.conf 中的内容
<IfModule proxy_module>
ProxyRequests on
ProxyPreserveHost Off
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID
ProxyPassReverse / balancer://mycluster/ stickysession=JSESSIONID
ProxyPassReverseCookiePath /myapp /
<Proxy balancer://mycluster >
BalancerMember http://localhost:8080/myapp route=tomcat1
BalancerMember http://localhost:9080/myapp route=tomcat2
Require all granted
ProxySet lbmethod=byrequests
</Proxy>
<Location /balancer>
SetHandler balancer
Require host www.mydomain.com
</Location>
</IfModule>
通过上述配置,我可以访问网站首页。当我访问 www.mydomain.com 时,它会加载登录页面 (www.mydomain.com/login.do)。当我单击其他链接时,它会打开正确的页面。例如:www.mydomain.com/password-reset.do 基本故障转移也有效。如果我关闭一个 Tomcat 实例,它会从另一个服务器提供页面,反之亦然。
但是当我尝试提交任何 POST 请求(例如尝试登录)时,url 更改为 www.mydomain/myapp/login.do 并始终显示登录页面。
我不确定上述配置项是否完全符合我的要求。有人能指出我哪里错了吗?此外,如果我在安全性方面缺少什么,请告诉我。我还想直接从 Web 服务器获取图像文件和其他文件。请告诉我如何做。
谢谢
答案1
这种情况通常发生在两种情况下。它不涉及平衡器 - 它在单个后端上同样发生。
应用程序 HTML 中的某个位置可以包含文字绝对 URL,例如http://example.com/myapp/post_here所以 POST 会到达那里(实际上会用http://127.0.0.1:xxxx/myapp/myapp/post_here)对此有很多种解决方案。
另一种可能性。POST 通常会导致重定向 (302)。后端可能会重定向到绝对 URLhttp://example.com/myapp/post_here不会被捕获。您的 ProxyPassReverse 目前只能捕获http://127.0.0.1:xxxx/myapp/post_here。您可以
ProxyPassReverse / http://example.com/myapp
在下面添加您的附加内容,这是允许的。
如果您将浏览器设置为记录网络请求/响应(Firefox 和 Chrome 中的开发人员选项),则这两种情况都很容易观察到。