Windows下面的Tomcat7与Apache2整合
1. 需求
因为项目需要,要将Tomcat与Apache整合起来,用到了mod_jk模块。
参考下述文章及下载内容:
http://hi.baidu.com/chongerfeia/item/0176469a37994edf7b7f01aa
http://www.cnblogs.com/jice/archive/2012/04/16/2406571.html
http://download.csdn.net/detail/shangkaikuo/4494837
mod_jk模块的总体功能:
由于tomcat的HTTP处理部分都由Java所写(5.5.12版本以后出现了native库,用以提高其I/O和SSL的性能[1]),在高并发的情况下负载较高。而apache对于静态文件的处理能力比tomcat强,所以tomcat开发组开发了与apache结合使用的mod_jk模块。该协议由apache作请求代理,将HTTP协议的请求转化为AJP协议包,并传给后端的tomcat。mod_jk和apache现在普遍使用AJP1.3协议[2]。它是一个二进制格式的协议,比字符格式的HTTP协议解析速度要快。
除了性能的提升,mod_jk另外的一个作用可以实现apache与tomcat一对多的对应,使后端tomcat负载均衡。mod_jk也提供apache与tomcat链接情况的监控。mod_jk模块的典型工作流程是这样的:一个HTTP请求过来,mod_jk模块根据其URI选择合适的worker来进行处理。如果是lb_worker(负载均衡的worker),就再根据各种条件选择后台合适的ajp_worker(处理AJP协议的worker)。ajp_worker将HTTP协议的包,组装成AJP协议格式的包,然后选取一条空闲的链接,发送给后台的tomcat服务器。等到后台将数据发送过来时,接收并解析AJP协议,重新组装成HTTP协议,然后把结果发送给客户端。
2. 环境
- JAVA_HOME=C:\Java\jdk1.6.0_33
- CATALINA_HOME=C:\tomcat7
- Apache版本为2.2,MSI方式安装于C:\Apache2.2目录,为系统服务。
- JK版本为mod_jk-1.2.31-httpd-2.2.3.so,在官网下载过高的版本,但在Apache下面不能正常工作。此版本JK可以在Apache2.2下面正常工作,是在csdn上面下载的,地址参考上面链接。
3. 安装
Java,Apache,Tomcat安装略;JK的安装就是将mod_jk-1.2.31-httpd-2.2.3.so拷贝到APACHE_HOME/modules/mod_jk.so
4. 配置
4.1 修改APACHE_HOME/config/httpd.conf文件
DocumentRoot: The directory out of which you will serve your documents.
因为我们是需要与Tomcat整合的,所以此项配置应该与Tomcat里配置的虚拟目录docBase属性相同;
DocumentRoot "D:/Work/uc/WebContent"
Directory: This should be changed to whatever you set DocumentRoot to.
<Directory "D:/Work/uc/WebContent">
VirtualHost: 'Main' server configuration
<VirtualHost localhost> DirectoryIndex index.html index.htm index.jsp #让Apache支持对servlet传送,用以Tomcat解析 JkMount /servlet/* ajp13 #让Apache支持对jsp传送,用以Tomcat解析 JkMount /*.jsp* ajp13 #让Apache支持对.bst传送,用以Tomcat解析 JkMount /*.bst* ajp13 #让Apache支持对Servlet传送,用以Tomcat解析 JkMount /RandCode* ajp13 </VirtualHost>
然后在文件最后加上下面一行:
include conf/mod_jk.conf
4.2 在与httpd.conf同目录创建mod_jk.conf,内容如下:
# 载入mod_jk.so包 LoadModule jk_module modules/mod_jk.so # 指定 workers.properties文件路径 JkWorkersFile conf/workers.properties # 设置日志存放路径 JkLogFile logs/mod_jk.log # 设置日志级别 [debug/error/info] JkLogLevel info # 设置日志格式 JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" # JkOptions indicate to send SSL KEY SIZE, JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories # JkRequestLogFormat set the request format JkRequestLogFormat "%w %V %T" # Send servlet for context /examples to worker named ajp13 #JkMount /servlet/* ajp13 # Send JSPs for context /examples to worker named ajp13 JkMount /* ajp13
4.3 在与httpd.conf目录创建workers.properties,内容如下:
#让mod_jk模块知道jdk workers.tomcat_home=C:/tomcat7 workers.java_home=C:/Java/jdk1.6.0_33 #指定文件路径分割符 ps=\ #上面的配置有用到的,不是将servlet和jsp都交给他了吗 worker.list=ajp13 #工作端口,若没占用则不用修改 worker.ajp13.port=8009 #Tomcat服务器的地址 worker.ajp13.host=localhost #类型 worker.ajp13.type=ajp13 #负载平衡因数 worker.ajp13.lbfactor=1
到此,配置结束。可以进行测试,访问http://localhost与http://localhost:8080的结果应该是一样的。
可能出现的问题,一个是mod_jk版本与Apache不匹配,二个是路径配置错误。可以通过注释各参数,重新启动Apache来测试问题在哪儿。