Apache Tomcat + Apache2 + mod_proxy:有关集群的问题

Apache Tomcat + Apache2 + mod_proxy:有关集群的问题

我有Tomcat 7.0.57一个Apache2使用后面的集群设置mod_proxy

Setup:
Apache2:192.168.2.139
Tomcat 节点1:ajp://192.168.2.166:8010(http 连接器也在端口 8082 上定义)
Tomcat 节点2: ajp://192.168.2.166:8011 (http 连接器也在端口 8083 上定义)

我有一个 Java Web 应用程序 (使用JerseyExtJS一些其他好东西),它是使用 部署的Parallel Deployment。部署工作正常,调用应用程序也是如此 (使用 Apache2 作为代理,这意味着http://http_proxy_ip/WebAppContext/app.html)。ExtJS前端显示正常。

WEB-INF/web.xml应用程序:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <distributable />
    <servlet>
        <servlet-name>FGJobServlet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.freightgate.quartz.servlet</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>FGJobServlet</servlet-name>
        <url-pattern>/scheduler/*</url-pattern>
    </servlet-mapping>
</web-app>



mod_proxy.conf

<VirtualHost *:80>
    DocumentRoot /var/www/html/
    ProxyRequests Off
    ProxyPreserveHost On

    <Proxy balancer://testcluster>
      BalancerMember ajp://192.168.2.166:8010/ route=acd11-node01
      BalancerMember ajp://192.168.2.166:8011/ route=acd11-node02
      ProxySet lbmethod=byrequests
    </Proxy>

    # Excluding balancer-manager app to make it available on master
    ProxyPass /balancer-manager !

    ProxyPass / balancer://testcluster/ stickysession=JSESSIONID|jsessionid
    ProxyPassReverse / balancer://testcluster/ stickysession=JSESSIONID|jsessionid

    <Location /balancer-manager>
      SetHandler balancer-manager
    </Location>

    <Directory "/var/www/html">
      AllowOverride AuthConfig
    </Directory>
</VirtualHost>



proxyExtJS 模型中的定义:

proxy : {
        type : 'rest',
        url : '/J_reportScheduler/scheduler/remotehost/scheduler',
        noCache: false,
        reader : {
            type : 'json',
            successProperty : 'success',
            messageProperty : 'message',
        },
        writer : {
            type : 'json',
        }
}



Servlet definition in Java

@Path("/{system}")
public class FGJobServlet extends HttpServlet {

    @POST
    @Path("/scheduler")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createJSON(
            JSONObject json,
            @PathParam("system") String system,
            @PathParam("cleanup") String cleanUp) {
       // logic goes here
    }
}


因此,当按钮被点击时,它会触发一个HTTP Post使用 URL 向 Java 后端发送 JSON 对象/J_reportScheduler/scheduler/remotehost/scheduler

当我从 Eclipse 本地运行它时,它运行良好(返回 Tomcat 实例的 URL)。在集群中运行它,我得到以下结果404 Not found并从 HTTP 服务器返回 URL:

Remote Address:192.168.2.139:80
Request URL:http://192.168.2.139/J_reportScheduler/scheduler/remotehost/scheduler
Request Method:POST
Status Code:404 Not Found
Request Headersview source
Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Content-Length:193
Content-Type:application/json
Host:192.168.2.139
Origin:http://192.168.2.139
Referer:http://192.168.2.139/J_reportScheduler/app.html
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
X-Requested-With:XMLHttpRequest
Request Payloadview source
{jobname: "ui101", description: "awd", startdate: "2015-01-21T00:00:00",…}
Response Headersview source
Connection:Keep-Alive
Content-Length:0
Date:Wed, 14 Jan 2015 23:32:56 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.6 (CentOS)



http connector使用工作正常的方式在集群节点之一上直接调用应用程序mod_proxy。所以,我猜想这与我的设置 有关。

我已经为此挣扎了 2 天,但似乎无法让它工作。任何帮助都非常感谢!

编辑#1:是的,我检查了 Apache 和 Tomcat 日志,只有 Apache 显示 404。应用程序日志也没有显示任何内容。

编辑#2:以防万一它不明显:HTTP Get请求工作正常。

答案1

尝试删除尾随斜杠balancermember

<Proxy balancer://testcluster>
  BalancerMember ajp://192.168.2.166:8010 route=acd11-node01
  BalancerMember ajp://192.168.2.166:8011 route=acd11-node02
  ProxySet lbmethod=byrequests
</Proxy>

相关内容