我有一个使用mod_proxy的Apache2后面的Tomcat 7.0.57集群设置。
Setup:
Apache2 :192.168.2.139
Tomcat Node1 :ajp://192.168.2.166:8010(端口8082上也定义了http连接器)
Tomcat Node2 :ajp://192.168.2.166:8011(在端口8083上也定义了http连接器)
我有一个使用Parallel Deployment的Java Web应用程序(使用Jersey , ExtJS和其他一些好东西)。 部署工作正常,调用应用程序也是如此(使用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>
ExtJS模型中的proxy定义:
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 } }
所以,当button被点击时,会触发一个HTTP Post使用URL /J_reportScheduler/scheduler/remotehost/scheduler将JSON对象发送到Java后端。
当我从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设置有关。
现在我已经为此挣扎了两天了,而且我似乎无法做到这一点。 任何帮助深表感谢!
编辑#1:是的,我已经检查了Apache和Tomcat日志,只是显示404的Apache。应用程序日志不显示任何东西。
编辑#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>