我有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 应用程序 (使用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
使用 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>