/ 中存储网

配置Apache反向代理tomcat服务器

2013-11-04 08:26:01 来源:IT技术网

给用户做了个网站,运行在tomcat6上,又给用户挂了个php的论坛,所以就把apache放在前面,除论坛外,其它都转交tomcat来处理。

一、初始配置

没有使用第三方的代理程序,直接使用apache自己实现的代理,在apache的httpd.conf中作了如下配置:

1、加载代理相关的动态库:

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

2、除论坛外,其它访问都转向tomcat,开始,我使用的是ajp:

ProxyPass /bbs !

ProxyPass / ajp://localhost:8009/

系统运行基本正常,但是有时会报如下错误:

-------------------------------------------------------------------------

2011-3-17 2:14:07 org.apache.jk.core.MsgContext action

警告: Error sending end packet

java.net.SocketException: Connection reset by peer: socket write error

at java.net.SocketOutputStream.socketWrite0(Native Method)

at java.net.SocketOutputStream.socketWrite(Unknown Source)

at java.net.SocketOutputStream.write(Unknown Source)

at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:531)

at org.apache.jk.common.JkInputStream.endMessage(JkInputStream.java:121)

at org.apache.jk.core.MsgContext.action(MsgContext.java:301)

at org.apache.coyote.Response.action(Response.java:183)

at org.apache.coyote.Response.finish(Response.java:305)

at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:195)

at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)

at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)

at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)

at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)

at java.lang.Thread.run(Unknown Source)

2011-3-17 2:14:07 org.apache.jk.common.ChannelSocket processConnection

警告: processCallbacks status 2

-----------------------------------------------------------------------------

经测试发现,我如果拼命按F5刷新页面,后台就容易报这种错误。

二、改进

作如下配置,不用ajp协议,换用http协议来访问,就不会报上面这个错误了:

LoadModule proxy_http_module modules/mod_proxy_http.so

ProxyPass / http://localhost:8080/

但这时,出现了另一个问题。当我访问“http://网站域名/index.action”时,正常;访问“http://网站域名”时,浏览器地址直接转向了“http://localhost:8080/index.action”,本地当然访问不了。使用ajp协议时,不会出现这个问题,换用http协议时就出现这个问题。

我网站首页的访问路径是index.action,但我没有做相关配置,当访问“http://网站域名”时,实际上是访问“http://网站域名/index.jsp”,在index.jsp中,通过response.sendRedirect("index.action");来转向。看来,AJP协议没有问题,HTTP协议,就把浏览器转向localhost了。

三、问题解决

1、方法一:修改index.jsp中的转向方式,采用如下方法就可以:

response.setStatus(301,"Moved Permanently");

response.addHeader("Location", request.getContextPath()+"/index.action");

2、方法二:修改web.xml,把welcome-file设置为index.action,然后在应用的根目录下,建立一个空文件,名字为index.action。

觉得方法二应该比方法一重定向要好。