客户请求通过Apache过滤转发到tomcat服务器,对于一些静态页面的请求,包括请求的Html文件,静态页面或者动态页面中的图片都直接由Apache处理,采用另外一种说法就是,对于用户发出的对动态页面的请求,如jsp、servlet,由Apache转发给Tomcat处理,可以有效提高服务器性能。下面记录配置过程。
环境配置:JDK1.4、Tomcat5.0.28、Apache2.0.58、mod_jk-apache-2.0.59.so(下载地址:http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.25/)
Tomcat配置:
在conf/server.xml中有
<Connector port="8009" enableLookups="false" redirectPort="8443" debug="0" protocol="AJP/1.3"/>,通过8009端口接收AJP13请求
增加一个配置文件,命名为worker.properties。内容如下
workers.tomcat_home=D:/developEnv/server/Tomcat528
workers.java_home=D:/developEnv/JDK/j2sdk1.4.2_05
ps=/
worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.ajp13.lbfactor=1
看key能明白每行配置的具体意思。这里的ajp13.port的值和上面server.xml中的Connector Port值一致,host根据实际情况,Apache所在机器地址
对于部署在Tomcat上的应用不需要任何变动,不论是直接将war放置在webapp里面,还是将应用的配置文件放在在conf/catalina/localhost/里面。至此Tomcat配置完毕。
Apache的配置:
修改Apache的httpd.xml文件
首先需要确认两个参数,Listen是指Apache的监听端口,不能和现已使用的端口冲突,否则Apache启动失败,在设置过程中,如果出现Apache启动失败的情况时,可以将同目录下的httpd.default.conf文件内容覆盖过来,这里存放的是Apache的默认配置。
另外一个参数是DocumentRoot,这是你的应用放置的起始位置,后面对于想通过Apache转发到Tomcat的应用,其静态内容的存放位置都是相对于该目录的。
在httpd.xml的最后增加如下内容
#加载mod_jk模块
LoadModule jk_module modules/mod_jk.so
#指向之前生成的Tomcat中conf目录下的workers.properties文件绝对路径
JkWorkersFile "D:/developEnv/server/Tomcat528/conf/workers.properties"
#模块工作日志存放文件
JKLogFile "d:/tmp/jkLog.log"
#日志记录级别,debug为最低级别,使用该级别时,系统日志量非常大,可以采用info、error
JKLogLevel error
ServerAdmin [email protected]
ServerName localhost
DirectoryIndex index.html index.htm index.jsp
#设置转发的请求url,这里设置对于jsp请求或者servlet请求都通过jkModule转发给Tomcat,如果设置JKMount /* Apache将不做任何工作,完全由Tomcat接替Apache,这样就没有整合的意义了,只是起到请求转发的功能,所有的客户请求还是交由Tomcat处理
JKMount /servlet/* ajp13
JKMount /*.jsp ajp13
可以使用 apache -t测试配置文件是否正确,如果错误会提示错误原因。
应用系统需要做一些相应的变动:
1、将系统中的一些静态内容按照目录结构移动到apache 的DocumentRoot的相应应用文件夹中,只有那些
问题以及问题解决:
1、问题:通过上面方法设置之后,可以通过Apache访问到JSP页面,测试表明静态内容是直接由Apache处理。但是访问server内容时,却不能解析,报404页面不能访问错。
解决:尽管JKMount /servlet/* ajp13已经设置了满足这种格式的请求由Tomcat处理,但是不能工作,目前的解决方法有2个,一个是重新银蛇server到一个url,并带上后缀,然后在JKMount中类似jsp那样设置,第二个方法是换用Apache2.2,Apache2.2已经支持Tomcat,采用Proxy方式。有知道解决访问虚拟目录访问请留言.
针对有多个应用的需求,设置虚拟主机
LoadModule jk_module modules/mod_jk.so
JkWorkersFile "D:/developEnv/server/Tomcat528/conf/workers.properties"
<VirtualHost *:81>
JKLogFile "d:/tmp/jkLog.log"
JKLogLevel info
DocumentRoot d:/data/apache/www
ServerAdmin [email protected]
ServerName hzCB
DirectoryIndex index.html index.htm index.jsp
JKMount /*.srv ajp13
JKMount /*.jsp ajp13
</VirtualHost>
<VirtualHost *:82>
ServerAdmin [email protected]
DocumentRoot d:/data/apache/www
ServerName hzPB
ErrorLog logs/pb.log
CustomLog logs/pbAccess.log common
</VirtualHost>
<VirtualHost *:83>
ServerAdmin [email protected]
DocumentRoot d:/data/apache/www
ServerName hzIM
ErrorLog logs/im.log
CustomLog logs/imAccess.log common
</VirtualHost>