Tomcat Apache + Apache2 + mod_proxy: Проблемы относительно кластера

У меня есть a 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
    }
}


Так, когда кнопка нажата, она запускает a 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 дней теперь, и я, может казаться, не заставляю его работать. Любая справка очень ценится!

EDIT#1: Да, я проверил Apache и журналы Tomcat, просто Apache, показывающий 404. Журнал приложения ничего не показывает также.

EDIT#2: На всякий случай это не было очевидно: HTTP Get запросы работают просто великолепно.

0
задан 15 January 2015 в 01:45
1 ответ

Попробуйте удалить завершающую косую черту из элемента балансировки :

<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>
2
ответ дан 4 December 2019 в 13:53

Теги

Похожие вопросы