Назад | Перейти на главную страницу

Apache Tomcat + Apache2 + mod_proxy: проблемы с кластером

у меня есть Tomcat 7.0.57 установка кластера за Apache2 с помощью mod_proxy.

Setup:
Apache2: 192.168.2.139
Tomcat Node1: ajp: //192.168.2.166: 8010 (http-коннектор также определен на порте 8082)
Tomcat Node2: ajp: //192.168.2.166: 8011 (http-коннектор также определен на порте 8083)

У меня есть веб-приложение Java (использующее Jersey, ExtJS и некоторые другие полезности), который развертывается с помощью 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>



proxy определение в модели ExtJS:

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 отправка объекта JSON в серверную часть Java с использованием URL-адреса /J_reportScheduler/scheduler/remotehost/scheduler.

Когда я запускаю это локально из Eclipse, он работает нормально (и он возвращается с URL-адресом экземпляра Tomcat). Запуск его в кластере дает мне следующее 404 Not found и возвращаясь с URL-адресом с HTTP-сервера:

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 запросы работают нормально.

Попробуйте удалить косую черту в конце 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>