Apache mod_proxy 平衡器配置与 POST 请求有关的问题

Apache mod_proxy 平衡器配置与 POST 请求有关的问题

我正在尝试使用 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

这种情况通常发生在两种情况下。它不涉及平衡器 - 它在单个后端上同样发生。

  1. 应用程序 HTML 中的某个位置可以包含文字绝对 URL,例如http://example.com/myapp/post_here所以 POST 会到达那里(实际上会用http://127.0.0.1:xxxx/myapp/myapp/post_here)对此有很多种解决方案。

  2. 另一种可能性。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 中的开发人员选项),则这两种情况都很容易观察到。

相关内容