谈谈我对apache+tomcat+jk2整合的理解

发表于:2007-05-25来源:作者:点击数: 标签:
我也是参照这里的大侠的文章来进行整合的,关于整合的文章特别是精华基本都看了。但是对于一个菜鸟来说,真的有好多地方看不懂,不仅这些整合的文章,其实对于好多帖子也有这个感觉,所以很希望这些高手能够多做一些解释和说明,以解我们心中之惑。 下面谈谈

我也是参照这里的大侠的文章来进行整合的,关于整合的文章特别是精华基本都看了。但是对于一个菜鸟来说,真的有好多地方看不懂,不仅这些整合的文章,其实对于好多帖子也有这个感觉,所以很希望这些高手能够多做一些解释和说明,以解我们心中之惑。

    下面谈谈我对整合理解与疑惑,有太多的不明白,所有其中有很多的臆想成份,请高手指正与解惑。
      
整合的目的(完全臆想)
------------------------------------------------------------------------------
      apache 和 tomcat都可以做为独立的WEB服务器来用,apache功能强大、高效,但并不能支持JSP及serlet,而tomcat正相反,所以要把它们结合起来。
    通过在apache中加载整合模块和进行设置,apache就能够根据url,把不属于自己的请求转给tomcat.

版本的选择的相关性:
------------------------------------------------------------------------------
1.Apache
     httpd2.0.x,对于与apache1.3.x等版本有什么区别不知道,应该有个飞跃吧,连名字都改成httpd了。而我们选择了用JK2整合,JK2是针对apache2.0的思想开发的(英语太差,见原文:JK2 has been developed with Apache 2.0 in mind),所以选择用httpd2.0.x。

2.整合方式-JK2
     为什么选择JK2呢?(JK  is a replacement to the elderly mod_jserv. It was a completely new Tomcat-Apache plug-in that handles the communication between Tomcat and Apache.The newest JK2 is a refactoring of JK . The native part has been completly restructured and the configuration has been simplified a lot.)我只看重了最后一句话,呵呵。在JK的文档中有关于以前的整合模块及JK、JK2功能的详细描述。

3.Tomcat5.0、J2SDK1.4.x
     能够支持JAVA,JSP,及Servlet的较新标准吧?它们之间应该有一定的关联,据说tomcat5及JDK1.4对中文的支持方式改变了不少,现在不用进行复杂的设置了就可以很好的使用中文,但对于针对以前JSP标准开发的页子的中文兼容性不太好。

编译安装过程中的注意事项:
-------------------------------------------------------------------------------
1.Apache
     必须编译成允许动态加载模块的方式,即在[b:b6d67f26da]configure时要加 --enable-so选项[/b:b6d67f26da],因为将来要加载mod_jk2这个整合模块。
     假设apache的安装目录为PathofApache,则编译的模块在PathofApache/modules下,配置文件在PathofApache/conf下。

2.tomcat
     只会用编译好的版本。解压、释放包就行了。(听说tomcat是JAVA写的,不知道用那个ANT编译有什么优势也没试成功过),假设tomcat安装目录为PathOfTomcat。

3.JDK
     我用的是二进制版本,直接运行,自己解压释放包。(如果用那个RPM包我不知道JAVA_HOME怎么设,呵呵)设置JAVA_HOME和CLASSPATH环境变量。JAVA_HOME也可以不设置而在PathOfTomcat/bin/catalina.sh中赋值,CLASSPATH目前我还没设置,也许在JSP中要用到JAVA标准类的时候要用到。

4。JK2模块编译
     假设JK2包释放后目录改名为PathOfJK2,且当前目录为PathOfJK2([b:b6d67f26da]参考JK文档,注意关于编译的部分在JK部分有说明,而默置要看JK2部分,因为不同的整合方式有很大的不同。http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jk2/
[/b:b6d67f26da])

cd jk/native2

chmod +755 buildconf.sh
./buildconf.sh (因为buildconf.sh没有执行权,所以要改,但“零二年的夏天”告诉我只要 sh buildconf.sh就可以执行了)

./configure --with-apxs2=PathOfApache/bin/apxs 
这个apxs在apache的安装目录的bin下,所以要先装apache。据说只有编译安装的apache才有这个文件,rpm包安装的没有这个文件,如果要给rpm包安装的apache编译整合模块,要找一个相同版本的编译一下用然后再删掉,版本号要完全相同,否则编译出来的模块不能用。
还有两个参数我没有,英文的说明也没看太懂,就在JK的文档中有说明:
--with-apache=DIR,DIR is the path where apache sources are located. The apache sources should have been configured before configuring mod_jk. DIR is something like: /home/apache/apache_1.3.19 It builds a static Apache module. 
--enable-EAPI,This parameter is needed when using Apache-1.3 and mod_ssl, otherwise you will get the error message: "this module might crash under EAPI!" when loading mod_jk.so in httpd. Not needed when --with-apxs has been used

另外,我在执行configure的时候提示有错误,好像是关于路径的,我就先启动了tomcat,执行通过。(也许是我没有设置关于tomcat目录的环境变量的原因)
make
make install

所有的文档都说如果发布不成功,那么要手工发布,我也是手工发布的:
cp PathOfJK2/build/jk2/apache2/mod_jk2.so  PathOfApache/modules/

配置文件的修改
-------------------------------------------------------------------------------
[b:b6d67f26da]JK2所用的配置文件有2个: 
    jk2.properties,默认要放在PathOfTomcat/conf中
    workers2.properties默认要放在PathOfApache/conf中[/b:b6d67f26da]
这两个文件的作用真的不明白,jk2.properties可能是定义tomcat与apache的通讯端口等,workers2.properties可能是告诉apache有哪些目录是tomcat支持的。

1.在PathOfTomcat/conf中有tomcat的主配置文件server.xml和JK2的配置文件jk2.properties。
    [b:b6d67f26da]实际上我对这两个文件没有做任何修改[/b:b6d67f26da],而jk2.properties缺省就是空的。看了看在server.xml中起作用的可能就是在第一个后面紧挨着的对于整合在起作用吧,没有应该加上。
 <!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 -->
  <Connector port="8009" enableLookups="false"  redirectPort="8443" debug="0"
  protocol="AJP/1.3" />

2.在PathOfApache/conf中有apache的配置文件httpd.conf,及JK2配置文件workers2.properties
[b:b6d67f26da]修改httpd.conf,只加入:LoadModule jk2_module modules/mod_jk2.so[/b:b6d67f26da]
关于workers2.properties,引用JK文档例子中最小配置如下:
# Define the communication channel 
[channel.socket:localhost:8009]
info=Ajp13 forwarding over socket
tomcatId=localhost:8009

# Map the Tomcat examples webapp to the Web server uri space
[uri:/examples/*]
info=Map the whole webapp

这个/examples应该是tomcat下的路径而不是apache的,但在这里做了映射,这个URL就能被apache接受并转给tomcat,而不用加tomcat的端口号了。
这样就完成了一种整合方式,这可能是最简单但很少用的配置方法吧
——————————————————————————

还有一种配置的方法很实用,但有一点地方不明白,适合做虚拟主机。

1.把apache与tomcat都做虚拟主机,并且相同的主机指向相同的根目录
2,默认情况下:jk2.properties可为空,workers2.properties不用做地址映射(?)
3.除了做虚拟主机,还要做如下修改
http.conf的修改
在虚拟主机之前加入
<Directory ~ "/WEB-INF/">
        Order allow,deny
        Deny from all
</Directory>
#因为apache与tomcat指向相同的目录,所在要禁止对WEB-INF的访问。

在虚拟主机的配置中
<Location ~ "/*.jsp|/*/servlet/*">
      JkUriSet worker ajp13:localhost:8009
</Location>
#这可能是做映射,将目录中的jsp和servlet由tomcat解析。

server.xml的修改

在虚拟主机的host中加入
<Context path="" docBase="" debug="1"/>
(这个tomcat很奇怪,不像apache只要指定DocumentRoot,那么网站的逻辑根目录就是DocumentRoot指定的了,而tomcat用appBase指定的应该叫什么呢?要用上面的一句将appBase指定的目录声明为根目录,appBase下其它目录默认情况下就是网站逻辑子目录)

关于虚拟主机整合的配置,JK文档的例子说得很清楚,或看本版的一篇精华。
------------------------

我就理解这么多,对于jk2.properties,workers2.properties,tomcat,apache里的配置参数根本很少了解,我想把它们理解了也许就明白了。。。。。。

诚惶诚恐,请大侠指正,以免害人

 icekernel 回复于:2004-04-17 11:15:20
server.xml
<Context path="" docBase="/path/yourjsp" debug="0" reloadable="true"
         crossContext="true"></Context>
这里应该是这样的吧 docBasej就是你所要定制的目录

 只爱一点点 回复于:2004-04-17 11:37:21
<Context path="" docBase="/path/yourjsp" debug="0" reloadable="true" 
crossContext="true"></Context> 
这个设置类似做虚拟目录,我也不懂。是把/path/yourjsp指定为根吗?但/path/yourjsp是根对于appBase指定的位置的?
也就是说将appBase指定的目录中的path/yourjsp目录指定为根目录?

但如果<Context path="" docBase="" debug="1"/> 
这样是不是就将appBase目录指定为根了呢?

 icekernel 回复于:2004-04-17 14:01:35
是把/path/yourjsp
这个指定为根 
<Context path="" docBase="" debug="1"/>
这样是不是就将appBase目录指定为根了呢?
对是把$tomcat/webapps指定为根

 jhsea3do 回复于:2004-04-17 21:09:47
逻辑,物理
相对,绝对


对于配置文件来说,url是逻辑地址,文件采用物理地址
相对地址是针对配置文件的绝对物理地址(或预制变量比如$catalina.home)而言,绝对呢就是前面有根标记"/"的地址了

<Context path="" docBase="/path/yourjsp" debug="0" reloadable="true"
crossContext="true"></Context>

的写法是正确的,但是如果你了解xml的话,你应该这样写
<Context path="" docBase="/path/yourjsp" debug="0" reloadable="true"
crossContext="true" />
或者
<Context>
<path></path>
<docBase>/path/yourjsp</docBase>
<debug>0</debug>
<reloadable>true</reloadable>
<crossContext>true</crossContext>
</Context>
这些都相当于对变量进行赋值
如同你在<host />标签中已经指明host的名称为localhost,那么你的站点URL就是http://localhost,而<path />标签是指明其后对象a的uri的起点为$path,如果$path=/pathA,那么uri为/pathA/a,那么和前面站点url在一起就成为了http://localhost/pathA/a,如果$path=NULL,你就可以理解了

<docBase />我就不费口舌了

 icekernel 回复于:2004-04-18 07:01:15
嘿嘿 还是楼上地 写法规范

 只爱一点点 回复于:2004-04-18 16:02:09
呵呵,以前看到两种方式觉得怪怪的,原来如此啊。


多谢版主加精。很惭愧,都是看以前的文档还有JK的文档,自己并没有把配置读通,好多基本的都不理解。

不过有时间我会努力看的,把一些初学、业余的、高手懒得写的东西补充好,使大家入门更容易些、理解得更多些。

我知道真正的掌握还得靠自己,但是对于初学者来说,比如我英文的理解字面意义都很难,看中文的也不知所云,所以还是希望高手能多些解释,使我们能更早的入门,这样才能自己看吧。比如上面的jhsea3do兄能参加讨论就很好啊,请高手少一些“不屑一顾”,呵呵

多谢。

 noah007 回复于:2004-04-18 22:54:42
很高兴看到这样的帖子,这才是技术论坛应该具备的气氛。
不好意思,我水了下,大家继续。

 自由狼-台风0 回复于:2004-06-05 06:47:06
编译那步出错,把错误记录抓出来了,但是不知道如何解决。
[code:1:fd10aa5652]
../../common/jk_channel_socket.c:74:2: #error "jk_channel_socket is deprecated"
make[1]: *** [../../../build/jk2/apache2/jk_channel_socket.lo] Error 1
make: *** [jk2-build] Error 1
[/code:1:fd10aa5652]

 goncha 回复于:2004-06-05 17:22:54
看了楼主的帖子,发现还是用socket来链接apache和tomcat的,不知有没有试过inprocess的模式运行apache和tomcat。这种模式下我没有成功过。

 只爱一点点 回复于:2004-06-08 13:02:32
呵呵,不懂。
只是为了做作业才胡乱看了点东西做了一下。

 双眼皮的猪 回复于:2004-06-11 01:01:07
可通过ajp13或者jni来做,不过好象有了ajp14啦~hoho~

 大菠萝 回复于:2004-06-13 15:07:06
可以用mod_jk2来做简单的负载平衡

 xiaohe83 回复于:2004-06-14 21:29:29
如把/path/yourjsp 指定为根,那WEB-INF/classes是否也该放在/path/youjsp目录下?

 jhsea3do 回复于:2004-06-14 22:48:56
每建立一个webApp项目就需要为其建立一个WEB-INF目录,存放相关的类库和配置文件~

原文转自:http://www.ltesting.net