tomcat问题解决

 

原理
tomcat为一个jsp的容器,apache为

一个web server,两者之间通信通过

worker进行(由Tomcat使用

Server.xml文件中Connector的标签

来定义其端口和协议),通过mod_jk

的模块(由web服务器像apache、

iis等使用)和Web Server通信。
通信协议有很多,其中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文件中的相应

定义即可。

第一部分:安装配置tomcat apache

mod_jk j2sdk

准备下载下列文件
Jdk1.4.2_08(1.5也可以,把JRE装

在JDK目录下)
下载地址: http://java.sun.com
tomcat 5.0.28
下载地址:

http://jakarta.apache.org
apache 2.0.53
下载地址:

http://httpd.apache.org
mod_jk-1.2.10-apache-2.0.53.so

(根据Apache版本决定)
下载地址:

http://archive.apache.org/dist/

jakarta/tomcat-connectors/
把上面所有组件都安装到D:/Server

目录下,这样也方便日常管理配置和

将来移植到别的服务器上去。
1:安装j2sdk
安装到 D:/server/j2sdk/ 目录下

,注意安装成系统服务
2: 安装tomcat
安装到D:/server/tomcat/目录下,

注意安装成系统服务
可能遇到的问题
问题1: 在解析JSP页面时,提示无法

找到java compiler
请拷贝 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目录拷

贝所有文件放到

c:/program */java/jre*/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.53.so 到d:/server/apache2

/modules/ 改名为mod_jk.so
5: 修改apache的配置文件
为了保持httpd.conf文件的简洁,把

jk模块的配置放到单独的文件中来,

就在httpd.conf中增加一行调用
include D:/server/Apache2

/conf/mod_jk.conf

6:配置mod_jk.conf
请注意使用绝对路径
其实最关键的就是 第一条 第二条

和最后一条,如果要精简,就保留这

三条内容就可以了。
# Load mod_jk module
LoadModule jk_module

modules/mod_jk.so

# Where to find

workers.properties
JkWorkersFile

conf/workers.properties

# Where to put jk logs
JkLogFile logs/mod_jk.log

# Set the jk log level

[debug/error/info]
JkLogLevel info

# Select the log format
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 /*.jsp ajp13

上面这一行我们设置了了 /*.jsp

ajp13 就是说把所有.jsp结尾的文件

都由ajp13这个worker交给tomcat处

理了,如果应用被映射为一个.do的

URL,这样就会出错.解决方法是再添

加如下一行:
JkMount /*.do ajp13

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 ,另一个是 www.ok.com
当然www.ok.com 是虚拟的,本地测

试时,应该修改系统中的hosts文件

,添加一行 127.0.0.1 www.ok.com
1:Apache 虚拟主机配置:
Httpd.conf文件最后添加
include D:/server/Apache2

/conf/vhost.conf

而vhost.conf内容写
NameVirtualHost *:80

ServerAdmin webmaster@localhost
DocumentRoot

/"D:/server/Tomcat/webapps/ROOT

/"
ServerName localhost
ErrorLog logs/localhost-

error_log
CustomLog logs/localhost-

access_log common


ServerAdmin webmaster@dummy-

host.example.com
DocumentRoot D:/server/www/
ServerName www.ok.com
ErrorLog logs/ok.com-error_log
CustomLog logs/ok.com-

access_log common
     

# 这样我可以看到apache服务器状态
SetHandler server-status
Order deny,allow
Deny from all
Allow from localhost
Allow from www.ok.com

2:Tomcat虚拟主机配置
添加新的www.ok.com 虚拟主机,在

tomcat安装路径/conf/server.xml

的最后,找到段,改为


debug=/"0/"

appBase=/"D:/server/www//"

unpackWARs=/"true/"

autoDeploy=/"true/"

xmlValidation=/"false/"

xmlNamespaceAware=/"false/">
 

docBase=/"./" />
 

className=/"org.apache.catalina

.logger.FileLogger/"

directory=/"logs/"

prefix=/"ok.com_log./"

suffix=/".txt/"

timestamp=/"true/" />
 

3:测试虚拟主机效果
访问http://localhost/ 应该可以

看到原来的tomcat默认页面。
写一个 index.jsp

<br>test jsp<br>
<%out.println(/"Hello World!/"

);%>

放在d:/server/www下面,访问

http://www.ok.com
页面显示Hello World! 就成功了

第三部分,部分相关性能优化及其它

问题
如何使用server版jvm ?
Jvm动态库有client和server两个版

本,分别针对桌面应用和服务器应用

做了相应的优化,client版本加 载

速度较快,server版本加载速度较慢

但运行起来较快。
在开始菜单 tomcat5 ->tomcat

config的java属性中 有一项 jvm路

径 指向server目录下的jvm就行了。
更改默认java.exe调用的jvm.dll,

这个由jvm.cfg决定。
编辑%JAVA_HOME%/jre/lib/i386

/jvm.cfg
里面第一行写的是 -client 默认就

是client版本 ,把第二行的-

server KNOWN 放到第一行, 如下

面所示
-server KNOWN
-client KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR

改完保存,然后看看默认版本:
C:/java -version
java version /"1.4.2_07/"
Java(TM) 2 Runtime

Environment, Standard Edition

(build 1.4.2_07-b05)
Java HotSpot(TM) Server VM (

build 1.4.2_07-b05, mixed mode

关于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)An operation

was attempted on something that

is not a socket.: winnt_accept:

AcceptEx failed. Attempting to

recover.
这是由于apache 使用了微软的

AcceptEx()调用的缘故,禁用掉即

可,此问题只会出现在win平台且

apache的2.0.49和更高版本上,出

现错误的大概原因是防火墙和防病毒

软件所导致,导致结果也有好几种,

像apache占用很高cpu资源或者网站

页面无法打开。
解决方法修改d:/server/apache2

/conf/httpd.conf中的mpm部分

ThreadsPerChild 250
MaxRequestsPerChild 0
Win32DisableAcceptEx   #添加这

一行即可,做过压力测试,对性能影

响很小,可以忽略

 

Generated by Bo-blog 2.0.2 sp2

你可能感兴趣的:(tomcat问题解决)