у меня есть 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>