日期:2014-05-17  浏览次数:20820 次

Tomcat+Apache2.2使用mod_proxy做请求转发

今天帮现场实施处理Tomcat + Apache2.2部署问题,在这里记录一下请求转发的配置:

?

参考下面这篇文章,我使用的是最简单的mod_proxy方式来配置, 这种方式只需要修改apache的配置文件即可


http://21nw.com/wap/index-wap2.php?p=10800

?

服务器环境:

  • Apache Httpd 2.2,? IP地址: 10.2.1.18:9090 (80端口被Plone占用)
  • Tomcat 6.0,???????????? IP地址: 10.2.1.104:8080
  • 操作系统: 两台机器都是WinXp
  • 待转发的项目名称: biandan_bj , 这样直接访问tomcat的地址是: http://10.2.1.104 :8080/biandan_bj

配置说明:

  1. 修改Apache\conf 目录下的 httpd.conf 文件, 去掉如下两行的注释 (前面的 “#”字符):
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_http_module modules/mod_proxy_http.so

?

  1. 在httpd.conf文件最后加上如下两行配置:
ProxyPass /biandan_bj http://10.2.1.104:8080/biandan_bj
ProxyPassReverse /biandan_bj http://10.2.1.104:8080/biandan_bj

?

?

配置完成后访问: http://10.2.1.18:8080/biandan_bj 即可将请求转发到 10.2.1.104的 tomcat 上

?

注意:

ProxyPass 和 ProxyPassReverse 必须成对出现,否则在页面跳转时会从10.2.1.18转到10.2.1.104上。现场实施只配了ProxyPass,因此出错。

?

P.S:配置方法的弊端

这种代理方式有一个很致命的问题。jsp中不能使用根据request获取的绝对路径,必须使用当前页的相对路径,例如eclipse创建jsp页面是会自动生成如下代码:

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

?

这里的path和basePath都不能使用。通过request获取的ServerName是tomcat主机的ip/hostname。如果采用如下方式引入资源,肯定会造成资源无法访问的问题:

<link rel="stylesheet" href="<%=path%>/css/dy-ui.css">
<script type="text/javascript" src="<%=path%>/js/preTaskList.js"></script>