Apache通过mod_proxy联合Tomcat

2009年11月30日 由 月影鹏鹏 留言 »

Apache通过mod_proxy联合Tomcat

设想:总体有Apache发布网站,而JSP由Tomcat处理,交由Apache输出。其它内容由Apache输出不变。
两种方法:JK和mod_proxy。
想想我也不会大规模JSP,干脆直接使用mod_proxy够绿色,够灵活。
我悲剧地发现,它的Apache没有编译mod_proxy模块。没办法,只能去Apache官方网站下载对应版本的源码包到VPS,然后进入解包

后的modules/proxy目录,运行
#/usr/local/apache2/bin/apxs -c -i mod_proxy.c proxy_util.c mod_proxy_http.c
进行编译。注意啦,Apache2.2后,proxy被拆成N个小模块,要编译mod_proxy_http.c才能进行http的proxy哦。

关于编译选项说明:
-c 执行编译操作
-i 安装操作,安装一个或多个动态共享对象到服务器的modules目录
-a 自动增加一个LoadModule行到httpd.conf文件,以激活此模块,若此行存在则启用之
-A 与-a类似,但是它增加的LoadModule行前有井号前缀(#)
-e 需要执行编辑操作,可与-a和-A选项配合使用,与-i操作类似,修改httpd.conf文件,但并不安装此模块

然后在httpd.conf加上:
LoadModule proxy_module       modules/mod_proxy.so
LoadModule proxy_http_module  modules/mod_proxy_http.so

在相应的虚拟主机的<virtualhost>加上:
ProxyPass / http://localhost:8080/
或者在2.2.5之后,可以这样加,使得Apache只处理servlet和.jsp和.do文件
ProxyPassMatch ^/servlet/(.*)$ http://localhost:8080/servlet/$1
ProxyPassMatch ^/(.*\.(jsp|do))$ http://localhost:8080/$1

月影鹏鹏认为 采用 proxy 的方式整合 tomcat的方式优点在于,可以方便的用其他软件替换前端的apche 或后端的tomcat,比如  用jboss 将tomcat 替换掉,其次就是 动态内容和静态内容可以方便的分离到台主机上。  月影鹏鹏在 http://www.homhow.com  上曾经实现过稳定的商业应用。在http://www.scanmon.com上也使用 proxy 方式 分离动静态的

注:由于Apache中正则表达式匹配的bug,“ProxyPassMatch ^(/.*\.(jsp|do))$ http://localhost:8080$1”会出错哦,所以采用

上面第二行的方案。

配置Tomcat:
serve.xml的“appBase”改为网站目录,“name”的相应的域名为localhost,因为代理模式是请求相应URL嘛。

但是如果有多个虚拟主机的话,就有点问题了。我遇到的问题是,如果代理的URL和访问的URL的目录级别不同,就会出现Tomcat输

出503错误。原因未知,解决方法未知。所以我采用虚拟主机的方法来管理多个域名站点。
首先,我们把Tomcat和Apache的虚拟主机设置成相同的路径。
Apache的就不罗嗦了,Tomcat如下配置:

<Host appBase=”虚拟主机的目录” autoDeploy=”true” name=”虚拟主机的域名” unpackWARs=”true”

xmlNamespaceAware=”false” xmlValidation=”false”>

<!– SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html –>
<!–
<Valve className=”org.apache.catalina.authenticator.SingleSignOn” />
–>

<!– Access log processes all example.
Documentation at: /docs/config/valve.html –>
<!–
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”localhost_access_log.” suffix=”.txt” pattern=”common” resolveHosts=”false”/>
–>

</Host>

然后,在etc/hosts中加入“127.0.0.1 yourdomain.com”这样的解析,这样就可以顺利使用proxy的URL代理。
最好,在Apache下把Proxy设置好,和上面类似,在相应的虚拟主机的<virtualhost>加上:
ProxyPass / http://虚拟主机的域名:8080/
或者在2.2.5之后,可以这样加,使得Apache只处理servlet和.jsp和.do文件
ProxyPassMatch ^/servlet/(.*)$ http://虚拟主机的域名:8080/servlet/$1
ProxyPassMatch ^/(.*\.(jsp|do))$ http://虚拟主机的域名:8080/$1

广告位

留言