Apache和Tomcat的整合原理及例子.docx
《Apache和Tomcat的整合原理及例子.docx》由会员分享,可在线阅读,更多相关《Apache和Tomcat的整合原理及例子.docx(15页珍藏版)》请在冰豆网上搜索。
Apache和Tomcat的整合原理及例子
Apache和Tomcat的整合,原理及例子
这类文档很多很多,但是大多是由不明原理的人拘泥于具体版本写出来的,有很多错漏或多余的部分。
最后找到一篇写得很很不错的,
我修正了其中的错误然后加了一些自己的理解
原理
tomcat为一个jsp的容器,apache为一个webserver,两者之间通信通过worker进行(由Tomcat使用Server.xml文件中Connector的标签来定义其端口和协议),通过mod_jk的模块(由web服务器像apache、iis等使用)和WebServer通信。
通信协议有很多,其中jk2已经被抛弃了,现在就用jk就好了。
整个过程其实就是让apache的httpd.conf文件调用mod_jk.conf,mod_jk.conf调用workers.properties,最后配置虚拟主机。
文件说明
mod_jk.conf
主要定义mod_jk模块的位置以及mod_jk模块的连接日志设置,还有定义worker.properties文件的位置。
worker.properties
定义worker的参数,主要是连接tomcat主机的地址和端口信息。
如果Tomcat与apache不在同一台机器上,或者需要做多台机器上tomcat的负载均衡只需要更改workers.properties文件中的相应定义即可。
第一部分:
安装配置tomcatapachemod_jkj2sdk
准备下载下列文件
Jdk1.5
下载地址:
tomcat5.5.9
下载地址:
http:
//jakarta.apache.org
apacheapache_2.0.59
下载地址:
http:
//httpd.apache.org/download.cgi
jakarta-tomcat-connectors-jk2.0.43-win32-apache2.0.49(根据Apache版本决定)
下载地址:
http:
//archive.apache.org/dist/jakarta/tomcat-connectors/
把上面所有组件都安装到D:
\Server目录下,这样也方便日常管理配置和将来移植到别的服务器上去。
1:
安装j2sdk
安装到D:
\server\j2sdk\目录下,注意安装成系统服务
2:
安装tomcat
安装到D:
\server\tomcat\目录下,注意安装成系统服务
可能遇到的问题
问题1:
在解析JSP页面时,提示无法找到javacompiler
请拷贝j2sdk\lib\tools.jar到tomcat\common\lib下面。
使用tomcat作为service启动后总是这样,当然用startup.bat脚本启动倒是完全正常。
主要原因分析起来是以service方式启动的Tomcat无法读取JAVA_HOME和CLASS_PATH等环境变量。
问题2:
如何解决通过服务方式启动tomcat时log中提示ZoneInfo:
d:
\server\j2sdk\lib\zi\ZoneInfoMappings(系统找不到指定的路径。
)
从d:
\server\j2sdk\jre\lib目录拷贝所有文件放到d:
\server\j2sdk\lib\,jre\lib中的文件和j2sdk\lib\中的文件没有一个重复的,不用担心会覆盖掉j2sdk\lib中原有的任何文件。
3:
安装apache到d:
\server\(会自动生成apache2文件夹)
配置index.jsp为默认页配置GB2312为默认语言
不只Apache的httpd.conf中定义了默认页面文件,连Tomcat的web.xml配置文件的结尾处也定义了默认页面文件,而且Tomcat中定义的的优先级还高于原有的Apache中所定义的默认页。
4:
加入mod_jk连接模块
拷贝mod_jk-1.2.10-apache-2.0.43.so到d:
\server\apache2\modules\改名为mod_jk.so
5:
修改apache的配置文件
为了保持httpd.conf文件的简洁,把jk模块的配置放到单独的文件中来,就在httpd.conf中增加一行调用代码
includeD:
\server\Apache2\conf\mod_jk.conf
6:
配置mod_jk.conf
请注意使用绝对路径
其实最关键的就是第一条第二条和最后一条,如果要精简,就保留这三条内容就可以了。
代码
#Loadmod_jkmodule
LoadModulejk_modulemodules/mod_jk.so
#Wheretofindworkers.properties
JkWorkersFileconf/workers.properties
#Wheretoputjklogs
JkLogFilelogs/mod_jk.log
#Setthejkloglevel[debug/error/info]
JkLogLevelinfo
#Selectthelogformat
JkLogStampFormat"[%a%b%d%H:
%M:
%S%Y]"
#JkOptionsindicatetosendSSLKEYSIZE,
JkOptions+ForwardKeySize+ForwardURICompat-ForwardDirectories
#JkRequestLogFormatsettherequestformat
JkRequestLogFormat"%w%V%T"
#Sendservletforcontext/examplestoworkernamedajp13
#JkMount/servlet/*ajp13
#SendJSPsforcontext/examplestoworkernamedajp13
JkMount/*.jspajp13
上面这一行我们设置了了/*.jspajp13就是说把所有.jsp结尾的文件都由ajp13这个worker交给tomcat处理了,如果应用被映射为一个.do的URL,这样就会出错.解决方法是再添加如下一行:
代码
JkMount/*.doajp13
7:
配置apache2\conf\workers.properties
代码
worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost#本机,若上面Tomcat主机不为localhost,作相应修改
worker.ajp13.type=ajp13#类型
worker.ajp13.lbfactor=1#代理数,不用修改
第二部分:
虚拟主机的配置
举例配置2个vhost网站一个是localhost,另一个是
当然是虚拟的,本地测试时,应该修改系统中的hosts文件,添加一行127.0.0.1
1:
Apache虚拟主机配置:
Httpd.conf文件最后添加
代码
includeD:
\server\Apache2\conf\vhost.conf
而vhost.conf内容写
代码
NameVirtualHost*:
80
80>
ServerAdminwebmasteratlocalhost
DocumentRoot"D:
/server/Tomcat/webapps/ROOT"
ServerNamelocalhost
ErrorLoglogs/localhost-error_log
CustomLoglogs/localhost-access_logcommon
80>
ServerAdminwebmaster@dummy-hostdot
DocumentRootD:
/server/www/
ServerName
ErrorLoglogs/-error_log
CustomLoglogs/-access_logcommon
#这样我可以看到apache服务器状态
SetHandlerserver-status
Orderdeny,allow
Denyfromall
Allowfromlocalhost
Allowfrom
2:
Tomcat虚拟主机配置
添加新的虚拟主机,在tomcat安装路径\conf\server.xml的最后,找到段,改为
代码
/server/www/"unpackWARs="true"autoDeploy="true"xmlValidation="false"xmlNamespaceAware="false">
3:
测试虚拟主机效果
访问http:
//localhost/应该可以看到原来的tomcat默认页面。
写一个index.jsp
代码
testjsp
<%
StringshowMessage="OhMyGod!
";
out.print(showMessage);
%>
放在d:
/server/www下面,访问
页面显示HelloWorld!
就成功了
第三部分,部分相关性能优化及其它问题
如何使用server版jvm?
Jvm动态库有client和server两个版本,分别针对桌面应用和服务器应用做了相应的优化,client版本加载速度较快,server版本加载速度较慢但运行起来较快。
在开始菜单tomcat5->tomcatconfig的java属性中有一项jvm路径指向server目录下的jvm就行了。
更改默认java.exe调用的jvm.dll,这个由jvm.cfg决定。
编辑%JAVA_HOME%\jre\lib\i386\jvm.cfg
里面第一行写的是-client默认就是client版本,把第二行的-serverKNOWN放到第一行,如下面所示
代码
-serverKNOWN
-clientKNOWN
-hotspotALIASED_TO-client
-classicWARN
-nativeERROR
-greenERROR
改完保存,然后看看默认版本:
C:
\java-version
javaversion"1.4.2_07"
Java(TM)2RuntimeEnvironment,StandardEdition(build1.4.2_07-b05)
JavaHotSpot(TM)ServerVM(build1.4.2_07-b05,mixedmode)
关于JAVA_HOME与CATALINA_HOME、CLASSPATH
ClassPath网上有人说在j2sdk1.3开始就不需要配置了,而本例中实际是不需要配置JAVA_HOME和CATALINA_HOME的,因为tomcat以service模式启动根本不认你的java_home,当然为了让你能够在命令行运行startup.bat时也能顺利启动Tomcat,可以配置也建议配置上JAVA_HOME与CATALINA_HOME,ClassPath就免了吧,连Resin都不需要这个了。
有关路径设置
Path=d:
\server\jdk\bin;……放到最前,避免有多个jdk时的很多问题
关于apache2在win平台上的一个小问题
可能apache的日志中常出现类似如下的提示
[error](730038)Anoperationwasattemptedonsomethingthatisnotasocket.:
winnt_accept:
AcceptExfailed.Attemptingtorecover.
这是由于apache使用了微软的AcceptEx()调用的缘故,禁用掉即可,此问题只会出现在win平台且apache的2.0.49和更高版本上,出现错误的大概原因是防火墙和防病毒软件所导致,导致结果也有好几种,像apache占用很高cpu资源或者网站页面无法打开。
解决方法修改d:
\server\apache2\conf\httpd.conf中的mpm部分
代码
ThreadsPerChild250
MaxRequestsPerChild0
Win32DisableAcceptEx#添加这一行即可,做过压力测试,对性能影响很小,可以忽略
tomcat集群和负载均衡的实现(session同步)
(一)环境说明
(1)服务器有4台,一台安装apache,三台安装tomcat
(2)apache2.0.55、tomcat5.5.15、jk2.0.4、jdk1.5.6或jdk1.4.2
(3)ip配置,一台安装apache的ip为192.168.0.88,三台安装tomcat的服务器ip分别为192.168.0.1/2/4
(二)安装过程
(1)在三台要安装tomcat的服务器上先安装jdk
(2)配置jdk的安装路径,在环境变量path中加入jdk的bin路径,新建环境变量JAVA_HOME指向jdk的安装路径
(3)在三台要安装tomcat的服务器上分别安装tomcat,调试三个tomcat到能够正常启动
(4)tomcat的默认WEB服务端口是8080,默认的模式是单独服务,我的三个tomcat的WEB服务端口修改为7080/8888/9999
修改位置为tomcat的安装目录下的conf/server.xml
修改前的配置为
maxThreads="150"minSpareThreads="25"maxSpareThreads="75"
enableLookups="false"redirectPort="8443"acceptCount="100"
connectionTimeout="20000"disableUploadTimeout="true"/>
修改后的配置为
maxThreads="150"minSpareThreads="25"maxSpareThreads="75"
enableLookups="false"redirectPort="8443"acceptCount="100"
connectionTimeout="20000"disableUploadTimeout="true"/>
依次修改每个tomcat的监听端口(7080/8888/9999)
(5)分别测试每个tomcat的启动是否正常
http:
//192.168.0.1:
7080
http:
//192.168.0.2:
8888
http:
//192.168.0.4:
9999
(三)负载均衡配置过程
(1)在那台要安装apache的服务器上安装apache2.0.55,我的安装路径为默认C:
\ProgramFiles\ApacheGroup\Apache2
(2)安装后测试apache能否正常启动,调试到能够正常启动http:
//192.168.0.88
(3)下载jk2.0.4后解压缩文件
(4)将解压缩后的目录中的modules目录中的mod_jk2.so文件复制到apache的安装目录下的modules目录中,我的为C:
\ProgramFiles\ApacheGroup\Apache2\modules
(5)修改apache的安装目录中的conf目录的配置文件httpd.conf,在文件中加LoadModule模块配置信息的最后加上一句LoadModulejk2_modulemodules/mod_jk2.so
(6)分别修改三个tomcat的配置文件conf/server.xml,修改内容如下
修改前
--AnEnginerepresentstheentrypoint(withinCatalina)thatprocesses
everyrequest.TheEngineimplementationforTomcatstandalone
analyzestheHTTPheadersincludedwiththerequest,andpassesthem
ontotheappropriateHost(virtualhost).-->
--YoushouldsetjvmRoutetosupportload-balancingviaAJPie:
-->
--Definethetoplevelcontainerinourcontainerhierarchy-->
修改后
--AnEnginerepresentstheentrypoint(withinCatalina)thatprocesses
everyrequest.TheEngineimplementationforTomcatstandalone
analyzestheHTTPheadersincludedwiththerequest,andpassesthem
ontotheappropriateHost(virtualhost).-->
--YoushouldsetjvmRoutetosupportload-balancingviaAJPie:
-->
--Definethetoplevelcontainerinourcontainerhierarchy
-->
将其中的jvmRoute="jvm1"分别修改为jvmRoute="tomcat1"和jvmRoute="tomcat2"和jvmRoute="tomcat3"
(7)然后重启三个tomcat,调试能够正常启动。
(8)在apache的安装目录中的conf目录下创建文件workers2.propertie,写入文件内容如下
#finethecommunicationchannel
[channel.socket:
192.168.0.1:
8009]
info=Ajp13forwardingoversocket
#配置第一个服务器
tomcatId=tomcat1#要和tomcat的配置文件server.xml中的jvmRoute="tomcat1"名称一致
debug=0
lb_factor=1#负载平衡因子,数字越大请求被分配的几率越高
#Definethecommunicationchannel
[channel.socket:
192.168.0.2:
8009]
info=Ajp13forwardingoversocket
tomcatId=tomcat2
debug=0
lb_factor=1
#Definethecommunicationchannel
[channel.socket:
192.168.0.4:
8009]
info=Ajp13forwardingoversocket
tomcatId=tomcat3
debug=0
lb_factor=1
[status:
]
info=Statusworker,displaysruntimeinformation.
[uri:
/jkstatus.jsp]
info=Displaystatusinformationandcheckstheconfigfileforchanges.
group=status:
[uri:
/*]
info=Mapthewholewebapp
debug=0
(9)在三个tomcat的安装目录中的webapps建立相同的应用,我和应用目录名为TomcatDemo,在三个应用目录中建立相同WEB-INF目录和页面index.jsp,index.jsp的页面内容如下
<%@pagecontentType="text/html;charset=GBK"%>
<%@pageimport="java.util.*"%>
ClusterAppTest
ServerInfo:
<%
out.println(request.getLocalAddr()+":
"