-->

Windows下面的Tomcat7与Apache2整合

2020-09-20 20:43发布

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. 环境

  1. JAVA_HOME=C:\Java\jdk1.6.0_33
  2. CATALINA_HOME=C:\tomcat7
  3. Apache版本为2.2,MSI方式安装于C:\Apache2.2目录,为系统服务。
  4. 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来测试问题在哪儿。

标签: