分享
 
 
 

Tomcat和Apache的集成

王朝system·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

Connector的选择

选择合适的Connector对于性能、配置的方便性有很重要的影响,目前大致上有JK1。x, JK2, mod_webapp三种connector可以使用。 JK使用比较广泛。JK2是JK1.x的改进,比较新。但是不太容易配置,相关的文档也比较少。此外,JK可以支持其他Web服务器和tomcat的集成。 但mod_webapp不支持。 因此,目前JK1.x是最好的选择。

获得JK

使用二进制版本

如果你对手工编译源代码心有余悸,使用二进制版本也许是个明智的选择。你可以从http://apache。linuxforum。net/dist/jakarta/tomcat-connectors/jk/binaries/下载JK1.x的最新版本。

然而,不幸的是二进制版本的JK和Apache的版本是捆绑在一起的,如果你使用了比较新的Apache(比如httpd-2.0.29)的话,往往很难找到对应的二进制版本的JK。

手工编译源代码

对于不同的操作系统和Apache的版本,如果没有预编译好的JK,则需要进行手工编译。除了Linux以外,其他操作系统一般不会安装编译环境。这时你还需要安装编译器。典型的例子是在Solaris上安装GCC,或是在Windows上安装Visual C++。另外,通常Open Source的软件一般都是用GNU的autoconf、automake生成自动配置脚本和Makefile的,JK也不例外。除了Linux以外的 Unix系统中的make不一定能够兼容这些脚本。所以如果你碰到这些问题就需要安装gmake。下面以Solaris8为例说明如何安装配置编译环境:

在Solaris8中系统自带的make不能兼容automake产生的某些Makefile。

需要的软件包:

gcc-3.3-sol9-sparc-local.gz

make-3.80-sol8-sparc-local.tar.gz

所有需要的软件包都可以在www.sunfreeware.com上下载到。

解压缩:

代码:

$gunzip gcc-3.3-sol9-sparc-local.gz

$gunzip make-3.80-sol8-sparc-local.gz

用pkgadd安装,需要root权限:

代码:

#pkgadd -d gcc-3.3-sol9-sparc-local

#pkgadd -d make-3.80-sol8-sparc-local

用pkgadd安装后,通常gcc, make会被安装在/usr/local/bin目录下。这是需要让gmake

成为系统默认的make。检查PATH环境变量,确保/usr/local/bin目录的位置在Solaris8自带的make的bin之前:

代码:

$which make

/usr/ccs/bin/make

$echo $PATH

/usr/bin:/usr/ccs/bin:/usr/local/bin

如果发现gmake还不是系统默认的make,可以修改/etc/profile调整PATH。但有一种更简单有效的方法,在/usr/bin目录下建一个到/usr/local/bin/make的符号连接make,这样就能使gmake成为系统默认的make了:

代码:

# cd /usr/bin

# ln -s /usr/local/bin/make make

同样的技巧可以解决一些Perl脚本对perl解释器可执行文件路径引用的不正确。如某个perl脚本的头信息有#!/usr/local/bin/perl -w但Perl在系统上被安装在/usr/bin/目录下。这时需要在

/usr/local/bin/下建立一个到/usr/bin/perl的符号连接perl。

编译完JK后,把它安装到apache中去,执行:

代码:

# make install

如果不成功,可以手工把mod_jk.so拷贝到apache的modules目录下。

配置

在具体动手配置之前应该考虑一下你集成的目标:仅仅是简单的把某个subcontext由tomcat处理,还是更高层次的动态/静态内容整合?是否允许HTTPS的转发;是否要进行负载平衡?具体配置的复杂度会因你的集成目标不同而大相径庭。

假定我们的集成目标是:

1. 所有的静态资源由Apache处理

2. 所有的动态资源由Tomcat处理

配置Tomcat

apache和tomcat整合大致上有三种方式:

1. 在apache进程中运行tomcat来处理动态内容

2. 通过ajp13协议,apache将动态内容的请求转发给tomcat

3. 使用本地高速Unix domain socket,apache将动态内容的请求转发给tomcat

方式2可以将apache和tomcat分布在不同的机器上,从而可以实现负载平衡。方式3速度比较快,当apache和tomcat分布在相同的机器上时可以考虑使用。

本文以方式2的为例说明tomcat和apache的集成。

为了能处理ajp13请求,tomcat需要起一个服务。 这是通过在tomcat的server.xml中定义一个Connector来实现的。 在最新的tomcat4.1.30版本中该Connector默认情况下是启用的。如果没有启用在server.xml加入

代码:

<Connector className="org。apache。coyote。tomcat4。CoyoteConnector"

port="8009" minProcessors="5" maxProcessors="75"

enableLookups="true" redirectPort="8443"

acceptCount="10" debug="0" connectionTimeout="20000"

useURIValidationHack="false"

protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/>

启动tomcat, 检查ajp13服务是否运行

netstat -a | grep 8009

或则查看tomcat标准输出上是否有类似的输出:

代码:

info: JK2: ajp13 listening on /0.0.0.0:8009

2004-5-22 14:50:35 org.apache.jk.server.JkMain start

info: Jk running ID=0 time=20/200 config=D:Tomcat4.1confjk2.properties

配置Apache

配置完Tomcat后,进行Apache的配置。首先,我们需要确定整个web应用所在的context,确定了context也就能确定用户通过什么样的URL可以访问该web应用。比如,网站为www.example.com,如果web应用的context为purchase,那么用户可以通过 URL http://www.example.com/purchase访问该应用;如果web应用的context为/,那么用户可以通过URL http://www.example.com访问该应用。一般而言,将web应用的context设定为/可以方便用户。如果存在多个独立的应用,可以考虑把它们放到不同的子context中去。下面介绍把应用context设为/情况下如何配置,其他情况类似。将jk的配置放在一个独立的文件里,然后在httpd。conf中Include该文件即可。

第一步,让apache加载mod_jk:

代码:

#mod jk for tomcat-apache integration

LoadModule jk_module modules/mod_jk.so

把应用context映射到存放该应用静态资源的目录:

代码:

# Static files in the examples webapp are served by apache

Alias / /www/tomcat4。1/webapps/ROOT/

同时,因为现在静态资源不是由tomcat处理了,所以出于安全考虑和遵守JSP/Servlet规范需要禁止对WEB-INF子目录的访问:

代码:

# The following line prohibits users from directly access WEB-INF

<Location "ROOT/WEB-INF/">

AllowOverride None

deny from all

</Location>

在集成的调试阶段可以考虑允许目录列表功能:

代码:

<Directory "/www/tomcat4。1/webapps/ROOT">

AllowOverride FileInfo AuthConfig Limit Indexes

Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

</Directory>

接下来一步告诉apache哪些动态内容应该让tomcat处理,为了确定动态内容URL的特征,应该把web.xml中的所有servlet mapping中出现的URL模式在jk.conf中声明:

代码:

JkMount /BaseServlet worker1

JkMount /Servlet/* worker1

JkMount /ProductUploadServlet worker1

JkMount /upload worker1

JkMount /test worker1

JkMount /*.jsp worker1

JkMount /*.do worker1

其它可能需要修改的配置

配置项 说明

JkWorkersFile 指定jk workers.properties的位置,如果是相对路径,则假定在apache的ServerRoot目录下

JkLogFile 指定jk log文件的位置,如果是相对路径,则假定在apache的ServerRoot目录下

JkLogLevel 指定jk log的级别有效的选项有:debug/error/info

JkLogStampFormat 指定log中的时间格式,使用c函数strftime()的格式字符串语法

总结Tomcat和Apache集成时通常需要一下步骤:

1. 决定使用哪种connector

2. 获得connector,如果没有现成的二进制的connector,则需要手工编译,根据操作系统的不同可能还要设置编译环境。

3. 配置tomcat

4. 配置apache,确定context,将context对应到应用的顶层目录。根据web.xml中的servlet映射把所有的动态内容的url模式配置在apache中

5. 测试

附录

一个完整的配置例子:

代码:

#mod jk for tomcat-apache integration

LoadModule jk_module modules/mod_jk.so

JkWorkersFile conf/workers.properties

# Where to put jk logs

JkLogFile logs/mod_jk。log

# Set the jk log level [debug/error/info]

JkLogLevel debug

# Select the log format

JkLogStampFormat "[%Y-%m-%d %H:%M:%S] "

# JkOptions indicate to send SSL KEY SIZE,

JkOptions +ForwardKeySize +ForwardURICompat +ForwardURICompatUnparsed -ForwardDirectories

# JkRequestLogFormat set the request format

JkRequestLogFormat "%w %V %T"

# Static files in the examples webapp are served by apache

Alias / /www/tomcat4。1/webapps/ROOT/

# The following line prohibits users from directly access WEB-INF

<Location "ROOT/WEB-INF/">

AllowOverride None

deny from all

</Location>

<Directory "/www/tomcat4.1/webapps/ROOT">

AllowOverride FileInfo AuthConfig Limit Indexes

Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

</Directory>

#JkAutoAlias /www/tomcat4.1/webapps/ROOT

JkMount /BaseServlet worker1

JkMount /Servlet/* worker1

JkMount /ProductUploadServlet worker1

JkMount /upload worker1

JkMount /test worker1

JkMount /*.jsp worker1

JkMount /*.do worker1

此外,jk还需要一个workers.properties文件配置jk本身的参数.如过不需要培植负载平衡

可以使用以下配置

代码:

# Define 1 real worker using ajp13

worker.list=worker1

# Set properties for worker1 (ajp13)

worker.worker1.type=ajp13

worker.worker1.host=127.0.0.1

worker.worker1.port=8009

worker.worker1.lbfactor=50

worker.worker1.cachesize=10

worker.worker1.cache_timeout=600

worker.worker1.socket_keepalive=1

worker.worker1.socket_timeout=300

要注意的是JkMount所引用的worker的名称必须是在work.list定义过的。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有