使用 Apache 和 Tomcat 结合 URL 重定向进行负载平衡



我现在有一台Apache服务器和两台Tomcat服务器。它们使用mod_jk模块连接。并配置了负载平衡。 所有请求都将重定向到 httpd.conf 中的负载均衡器:

JKMount /* controller

控制器是负载平衡器,工作 tomcat 服务器是 worker1,worker2。

问题是,除了自动加载调度之外,我还需要一个 url 匹配重定向。具体而言,http://www.example.com/test1/index.html 请求应转到 worker1 (Tomcat),http://www.example.com/test2/index.html 转到 worker2。但是,在 worker1 和 worker2 中,应用程序结构都是 webapps/test/结构。

我可以使用 mod_jk url 映射将/test1/调度到 worker1 和/test2/到 worker2,但 PATH 将是/test1/和/test2/而不是/test/。同时,如果我使用 apache redirectMatch 或 url 重写将/test1/(/test2/) 更改为/test/,mod_jk现在不会将 url 分派给不同的工作线程,因为它们具有相同的 PATH。

我该如何处理这种情况?

您需要使应用程序成为 Tomcat 中的根应用程序。为此,您可以通过以下内容向应用添加元信息/上下文.xml:

<Context path="/"/>

我建议您从网络应用程序目录中删除其他应用程序。然后,您需要更改您的应用程序 web.xml以便 servlet 现在映射到具有适当上下文的相应 url:

<servlet-mapping>
    <servlet-name>TestApp</servlet-name>
    <url-pattern>/test</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>TestApp</servlet-name>
    <url-pattern>/test1</url-pattern>
</servlet-mapping>

第二个 JVM 中的应用程序将需要 url-pattern/test2。对于Apache/Tomcat连接,我使用mod_ajp而不是mod_jk。以下是您在 Apache 中mod_ajp所需的内容:

<Proxy balancer://cluster>
    BalancerMember ajp://127.0.0.1:8015 route=ajp13_node1
    BalancerMember ajp://127.0.0.1:8016 route=ajp13_node2
</Proxy>
<Location "/test">
    ProxyPass balancer://cluster/test stickysession=JSESSIONID
</Location>
<Location "/test1">
    ProxyPass ajp://127.0.0.1:8015/test1
</Location>
<Location "/test2">
    ProxyPass ajp://127.0.0.1:8016/test2
</Location>

这是假设 AJP 连接器正在侦听第一个 JVM 的 8015 和第二个 JVM 的 8016。

也许一个简单的方法是在tomcat工作服务器上使用urlrewrite过滤器。根据文档,您应该在urlrewrite.xml文件上具有以下规则:

    <rule>
       <from>^/test[0-9]*/(.*)$</from>
       <to type="redirect">/$1</to>
    </rule>

因此,工作人员将忽略 test1 或 test2 URI 部分。Apache可以按照你计划的方式工作mod_jk。

最新更新