windows环境下使用JK1.2整合apache2.2和tomcat7

身边有位同学这学期用PHP帮学校开发了好几个网站,昨天去服务器上部署时发现那台服务器上既要跑IIS上的ASP网站,又要跑tomcat下的JSP网站,这回他又得去给装个跑PHP的apache httpd,一下次不知道该怎么办了。我听了也是一阵狂汗,这种案例大概也只有学校才会发生了。不过汗归汗,问题还是要解决的,这种情况下主要有三种部署策略。

1、IIS、apache httpd、tomcat各自作为web server跑不同的网站,使用不同的端口,比如:IIS(80),apache httpd(8080),tomcat(9090)。这种方式最明显的好处是直接,配置简单,三个server各跑个的网站,互不影响。缺点是服务器要额外开放8080和9090两个端口,而且相应的PHP网站和JSP网站都要加上8080,9090的端口号,地址非常不容易记忆。

2、使用IIS和apache httpd做web server,tomcat作为Servlet容器与IIS整合。这样IIS同时支持ASP与JSP网站,因此可以选择默认端口号80,而apache httpd使用8080单独跑PHP网站。这种方式的优点是只需要单独开放8080端口即可,ASP与JSP的网站都可以使用默认端口,对用户更加友好。而且如果JSP网站的访问量比较大的话,可以用IIS来处理静态资源(html,image,js,css等),效率比tomcat内置的web server要高的多。缺点是需要额外的配置来整合IIS与tomcat,操作比较麻烦。

3、与策略二类似,但是将tomcat与apache httpd进行整合,相应的apache httpd使用80端口跑PHP和JSP网站,IIS用8080端口跑ASP网站。

对于学校的网站部署,以上三种策略都没什么问题。要是偷懒的话首选策略一,但是考虑到生产环境下,人们更多地用apache与tomcat整合,我们也选择了第三种策略。毕竟学生嘛,能学点东西最好啦:)

下面就介绍如何使用tomcat连接器JK,在windows环境下整合apache2.2与tomcat7

1.下载JK

首先,去tomcat的官网下载JK,目前的最新版本是1.2.32,选择Binary Releases即可。

在Index中进入windows目录,因为我们使用的apache版本为2.2,因此选择下载tomcat-connectors-1.2.32-windows-i386-httpd-2.2.x.zip

解压zip包,将其中的mod_jk.so动态链接库文件放到apache安装目录(下文用%APACHE_HOME%代替)的modules目录下。

2.定义tomcat workers

什么是tomcat worker?根据JK官方文档的解释,tomcat worker就是一个tomcat的实例,或者说,一个tomcat进程。它代表web server来处理对servlet的请求或者其他内容的请求。我们知道,apache httpd服务器本身只可以处理静态的web资源,如果遇到了servlet请求,就需要交给我们定义的这个tomcat worker来处理了。那么怎么定义tomcat worker呢?

在JK中,使用属性文件workers.properties来定义一个或多个tomcat的实例。进入%APACHE_HOME%conf目录,新建一个workers.properties文件,键入一下内容:

# woker.list中可以定义多个worker,用空格分开,此处我们只需要一个worker即可
worker.list=localworker1
# 指定localworker1的属性
worker.localworker1.type=ajp13 # 使用AJP/1.3协议连接
worker.localworker1.host=localhost # tomcat在本机上
worker.localworker1.port=8009 # AJP/1.3的默认端口号

我们在该文件中定义了一个叫localworker1的tomcat实例,并指定其使用ajpv13协议与tomcat沟通。这是什么意思呢?进入tomcat安装目录(下文用%TOMCAT_HOME%代替)下的conf目录,查看server.xml中有关于ajpv13连接器的默认配置:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

以上表明,本机的tomcat实例在8009端口启动了AJP/1.3的连接器,apache httpd服务器将通过AJP/1.3协议与该tomcat实例进行通信!因此,上面worker的配置和tomcat的AJP13连接器的配置需要一致。

关于workers.properties的更多说明见http://tomcat.apache.org/connectors-doc/reference/workers.html

3.定义路由规则

有了tomcat woker,我们还需要指定什么样的请求由httpd服务器处理,什么样的请求交给tomcat,即路由规则。通常,我们会把对web静态资源(如html,image,css,js文件)的请求交给web服务器处理,将对servlet,jsp的请求交给tomcat处理。路由规则通常在一个叫做uriworkermap.properties的属性文件中定义。下面在%APACHE_HOME%conf目录下新建uriworkermap.properties文件,键入一下内容:

/*=localworker1
# 静态文件不由任何worker处理,交给apache httpd
!/*.gif=*
!/*.jpg=*
!/*.png=*
!/*.css=*
!/*.js=*
!/*.htm=*
!/*.html=*

这里我们先将所有请求交给先前定义的tomcat worker处理,在用!语法指明某些静态资源由apache httpd处理。这是JK官方推荐的写法!我在其他网站的教程中发现很流行这样的写法:

/*.jsp=localworker1
/*.do=localworker1
/servlet/*=localworker1

这种写法指定所有的jsp请求,action请求(使用struts框架的action请求通常以.do作为后缀),和servlet请求交给tomcat处理,剩余的请求交给apache httpd处理。强烈不建议,我认为这种写法至少有以下两点不足:

1. 限定了JSP网站的URL写法。比如,JSP网站所有servlet的urlpattern必须为/servlet/*的形式,否则请求不会到达tomcat。

2. 重大安全隐患!如果不做其他配置,用户将能够访问网站WEB-INF目录下的web.xml和class目录下的class文件。这是因为tomcat本身是能禁止用户访问WEB-INF目录的,而apache并不会。这种路由写法只将jsp和servlet的请求交给tomcat处理,用户请求/WEB-INF/web.xml时,apache httpd默认情况下自然会将文件返回给用户。第一种写法就没有这个问题,因为/WEB-INF/还是由tomcat处理的。

关于uriworkermap.properties的更多说明见http://tomcat.apache.org/connectors-doc/reference/uriworkermap.html

4. 定义VirtualHost

有人可能要问,如果像上面那样配置,对PHP文件的请求岂不是也交给tomcat处理了。嘿嘿,不会的,因为PHP网站和JSP网站会使用不同的域名啊,apache httpd支持配置虚拟主机,即一个IP地址多个域名,这样的话,我们只需要正对JSP网站启动JK即可。

虚拟主机的配置可以写在%APACHE_HOME%conf/httpd.conf中,但是更推荐的写法是修改%APACHE_HOME%conf/extra/httpd-vhosts.conf文件。假设我们的PHP网站域名为www.phpsite.com,JSP网站的域名为www.jspsite.com,配置如下:

NameVirtualHost *:80

# php website host
<VirtualHost *:80>
ServerAdmin xxx@xxx.com
ServerName www.phpsite.com
ErrorLog "logs/www.phpsite.com-error.log"
CustomLog "logs/www.phpsite.com-access.log" common
DocumentRoot "E:/PHP_WWW"
DirectoryIndex index.html index.php
</VirtualHost>

# java website host
<VirtualHost *:80>
ServerAdmin xxx@xxx.com
ServerName www.jspsite.com
ErrorLog "logs/www.jspsite.com-error.log"
CustomLog "logs/www.jspsite.com-access.log" common
DirectoryIndex index.html index.jsp

JkAutoAlias "E:/JSP_WWW"
JkMountFile "conf/uriworkermap.properties"
</VirtualHost>

其中E:/PHP_WWW和E:/JSP_WWW分别php网站和jsp网站的根目录。

JkAutoAlias会将JSP网站的上下文映射到apache的目录空间下。因此用户访问www.jspsite.com/hello/a.jpg时,apache就会去E:/JSP_WWW/hello/a.jpg目录下找相应的静态资源。

JkMountFile即指明刚才我们定义的路由规则属性文件的路径。

5.修改tomcat的server.xml

下面打开%TOMCAT_HOME%conf/server.xml,做如下修改:

1) 因为我们的server上还有IIS需要占用8080端口,因此我们需要将tomcat默认的http server服务关闭,或更改端口。找到如下配置,将其注释。

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout
="20000"
redirectPort
="8443" />

2)上面指定了jsp网站的目录为E:/JSP_WWW,因此需要修改默认的appBase。

<Host name="localhost"  appBase="E:/JSP_WWW"
unpackWARs
="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix
="localhost_access_log." suffix=".txt"
pattern
="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>

3)为了测试,将%TOMCAT_HOME%webapps/目录下的examples目录拷贝到E:/JSP_WWW。

4)运行%TOMCAT_HOME%bin/startup.bat启动tomcat,看到如下日志表明启动成功。

6.修改apache的httpd.conf文件

下面我们来修改apache的主配置文件httpd.conf,打开%APACHE_HOME%conf/httpd.conf

1)首先确认apache httpd的启动端口为80:

Listen 80

2)然后找到加载模块的区域(一大串LoadModule开始的部分),在下面添加以下三行,加载jk_module:

LoadModule jk_module modules/mod_jk.so
JkWorkersFile "conf/workers.properties" #指定先前配置的worker文件
JkLogFile "logs/mod_jk.log"

3)指定PHP网站的DocumentRoot,如果之前配过PHP的话,应该能找到如下配置(为了大家看起来方便,我去掉了所有注释):

DocumentRoot "E:/PHP_WWW"
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</Directory>
<Directory "E:/PHP_WWW">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>

4)继续往下找到Include文件部分,去掉"#Include conf/extra/httpd-vhosts.conf"前的"#"号,包含我们刚才修改的虚拟主机配置文件。

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

5)保存退出,启动apache httpd。

7.测试配置是否成功

注:如果想在自己电脑上整合apache与tomcat,又没有域名的话,可以修改hosts文件,在文件最下面添加:

127.0.0.1 www.phpsite.com
127.0.0.1 www.jspsite.com

1)测试php网站。在E:/PHP_WWW目录新建index.php,输入:

<?
phpinfo();
?>

打开浏览器,访问"www.phpsite.com",见到如下页面说明PHP网站能正常运行。

2)测试JSP网站。访问"www.jspsite.com/examples"和"www.jspsite.com/examples/servlets/servlet/HelloWorldExample",前者测试能否访问静态资源index.html,后者测试能否访问servlet。

我们还可以测试能否访问到WEB-INF目录,"www.jspsite.com/examples/WEB-INF/web.xml",按照上文第一种uriworkermap.properties写法的话是访问不到的:)

其他整合方式

apache2.2以后,除了使用JK来整合apache httpd与tomcat,还有一种更方便的方式,就是使用新增加的mod_proxy_ajp模块,我还没试过,有兴趣的朋友可以尝试一下。不过JK总体来说还是会更强大一些,因为它还支持tomcat集群,负载均衡相关的配置。

 


欢迎转载,但是转载请注明出处http://www.cnblogs.com/codingmyworld/archive/2011/12/08/2281057.html  
posted @ 2011-12-09 14:35  CodingMyWorld  阅读(3740)  评论(6编辑  收藏  举报