Iis6.0
和
tomcat5.5+sql2000
整合方案
段高辉
2007-10-20
准备条件:
jdk-1_5_0_03-windows-i586-p.exe
SQL2000-KB884525-SP4-x86-CHS.EXE
apache-tomcat-5.5.23.exe
tomcat-connectors-1.2.23-src
sql2000
从
Apache
的网站上下载
jk
的
1.2.20
版本,实际上现在就只有一个
isapi_redirect.dll
文件
1.
安装
jdk
2.
路径选择为
D:/ProgramFiles
3.
安装
sql2000
路径选择为:
D:/Program Files/Microsoft SQL Server
4.
安装
tomcat
路径选择为:
D:/Program Files/Apache Software Foundation/Tomcat 5.5
5.
环境变量
---------------------------------------
CLASSPATH=.;D:/ProgramFiles/Java/jdk1.5.0_03/lib/tools.jar;D:/Program Files/Java/jdk1.5.0_03/lib/dt.jar;D:/ProgramFiles/Java/jdk1.5.0_03/bin;D:/Program Files/Apache Software Foundation/Tomcat 5.5/common/lib/servlet-api.jar
JAVA_HOME= D:/Program Files/Java/jdk1.5.0_03/
PATH=D:/ProgramFiles/Java/jdk1.5.0_03/bin/;%SystemRoot%/system32;%SystemRoot%;%SystemRoot%/System32/Wbem;D:/Program Files/Microsoft SQL Server/80/Tools/BINN
TOMCAT_HOME= D:/Program Files/Apache Software Foundation/Tomcat 5.5
-----------------------------------------------------------
6.
将
tomcat-connectors-1.2.23-src
减压在
tomcat-connectors-1.2.23-src/conf
目录下的连个文件拷贝到
D
的新建文件夹下
jakarta(
注意这个单词的拼写,以后要多次用到
)
。
7.
uriworkermap.properties
和
worker.properties
两个文件的配置如下:
---------------------------------------------------------
/*.jsp=worker1
!/*.jpg=worker1
!/*.asp=worker1
!/*.gif=worker1
!/*.js=worker1
!/*.swf=worker1
!/*.png=worker1
!/*.htm=worker1
!/*.html=worker1
!/*.rar=worker1
!/*.zip=worker1
!/*.avi=worker1
!/*.rmvb=worker1
--------------------------------------------------------------------
注意:
worker1
表示一个对象;
------------------------------------------------------------------------------
workers.tomcat_home=" D:/Program Files/Apache Software Foundation/Tomcat 5.5"
workers.java_home="D:/Program Files/Java/jdk1.5.0_03/"
ps=/
worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
------------------------------------------------------------------------------------
8.
修改注册表:
9.
创建
isapi.reg
文件在
jakarta
文件下:
----------------------------------------------------------------------
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE/SOFTWARE/Apache Software Foundation]
[HKEY_LOCAL_MACHINE/SOFTWARE/Apache Software Foundation/Jakarta Isapi Redirector]
[HKEY_LOCAL_MACHINE/SOFTWARE/Apache Software Foundation/Jakarta Isapi Redirector/1.0]
"extension_uri"="/jakarta/isapi_redirect.dll"
"worker_file"="D://ProgramFiles//ApacheSoftwareFoundation//Tomcat 5.5//conf//workers.properties"
"worker_mount_file"="D://ProgramFiles//ApacheSoftwareFoundation//Tomcat 5.5//conf//uriworkermap.properties"
"log_file"= D://Program Files//Apache Software Foundation//Tomcat 5.5//logs//isapi.log"
"log_level"="debug"
-------------------------------------------------------------------------------------------------------
10.
为
jk
建立物理目录
从 Apache 的网站上下载 jk 的 1.2.20 版本,实际上现在就只有一个 isapi_redirect.dll 文件。在 jakarta 目录将 isapi_redirect.dll 复制到里面。
从 Apache 的网站上下载 jk 的 1.2.20 版本,实际上现在就只有一个 isapi_redirect.dll 文件。在 jakarta 目录将 isapi_redirect.dll 复制到里面。
11.
建立新网站
打开 IIS 管理器,在左侧网站一栏新建网站,其目录指向上面提到过的空目录 wwwroot ,让网站有执行 ( 如 ISAPI 应用程序或 CGI) 的权限
设置筛选器
在 IIS 管理器左侧网站下面选中新建的网站 www.XXXX.cn ,右键选择属性 , 在 ISAPI 筛选器标签页添加筛选器,名字为 jakarta ,路径为 isapi_redirect.dll 的路径名,即 D:/Program Files/Apache Software Foundation/Tomcat 5.50/bin/jakarta/isapi_redirect.dll 。如果成功重新进入属性页,则该新建的筛选器会有一个绿色向上箭头,优先级为高,这说明 jk 模块加载成功。
打开 IIS 管理器,在左侧网站一栏新建网站,其目录指向上面提到过的空目录 wwwroot ,让网站有执行 ( 如 ISAPI 应用程序或 CGI) 的权限
设置筛选器
在 IIS 管理器左侧网站下面选中新建的网站 www.XXXX.cn ,右键选择属性 , 在 ISAPI 筛选器标签页添加筛选器,名字为 jakarta ,路径为 isapi_redirect.dll 的路径名,即 D:/Program Files/Apache Software Foundation/Tomcat 5.50/bin/jakarta/isapi_redirect.dll 。如果成功重新进入属性页,则该新建的筛选器会有一个绿色向上箭头,优先级为高,这说明 jk 模块加载成功。
12.
为
jk
建立虚拟目录
选中网站 www.xxxx.cn ,新建虚拟目录,别名为 jakarta ,路径为 D:/Program Files/Apache Software Foundation/Tomcat 5.5/bin/jakarta ,使其有执行 ( 如 ISAPI 应用程序或 CGI) 的权限。
为自己的应用建立虚拟目录
选中网站 www.xxxx.cn ,新建虚拟目录,别名为 jakarta ,路径为 d:javakarta ,使其有执行 ( 如 ISAPI 应用程序或 CGI) 的权限。
新建应用程序扩展
在 IIS 管理器左侧网站下面选中 Web 服务扩展,添加一个新的 Web 服务扩展,扩展名为 jakarta, 添加要求得文件为 D:/ jakart/isapi_redirect.dll, 并设置扩展状态为允许。
测试
选中网站 www.xxxx.cn ,新建虚拟目录,别名为 jakarta ,路径为 D:/Program Files/Apache Software Foundation/Tomcat 5.5/bin/jakarta ,使其有执行 ( 如 ISAPI 应用程序或 CGI) 的权限。
为自己的应用建立虚拟目录
选中网站 www.xxxx.cn ,新建虚拟目录,别名为 jakarta ,路径为 d:javakarta ,使其有执行 ( 如 ISAPI 应用程序或 CGI) 的权限。
新建应用程序扩展
在 IIS 管理器左侧网站下面选中 Web 服务扩展,添加一个新的 Web 服务扩展,扩展名为 jakarta, 添加要求得文件为 D:/ jakart/isapi_redirect.dll, 并设置扩展状态为允许。
测试
13.
打开
http://localhost
和
http://localhost:8080
看是否相同如果相同恭喜整合成功,如果不通,整合失败:失败原因一般为:
1
环境变量
2isapi
筛选器是否为绿色
3
上面的几个配置文件是否正确。应该没有什么问题,以前的版本有直接的安装程序,现在却没有了。手册上还说可以直接写配置文件不写注册表,我没有试,主要是不清楚原理。注意你的两个配置文件
workers.properties
和
uriworkermap.properties
中的两个
worker
是不是都叫
worker1
,有没有拼写错误
.
还有如果你配置网站时做了主机头设置
,
那你
workers.properties
文件中
worker.ajp13.host
的值应该是
www.xxxx.cn而不是localhost
14.
如果是出现无权访问此页面则设置
iis
访问权限:
1.
设置网站访问权限,
2
设置虚拟目录访问权限
3
,设置文件夹访问权限
4
,设置
jakarta
权限!在设置权限的过程中,添加管理员用户和系统用户,并新建一个自己的网站访问用户!。
15.
解析:
Workers
实际上属于
Tomcat
的链接器(
Connector
),代表了一个
Tomcat
实例,这个实例代表了由某种
web
服务器来执行
servelet
程序。实际上我们可以通过配置多个
Worker
来代表某一种
web
服务器去执行
servelet
。这样做的原因是:我们常常希望不同的上下文能够被不同的
worker
处理,这些
worker
可以提供不同的开发环境,使得所有开发者可以共享一个服务器而每个人都拥有自己的
worker
。我们希望不同的虚拟主机能够由不同
Tomcat
进程来处理,并且这些处理于各个公司之间的
站点间进行处理时彼此是完全独立的。我们想要提供负载平衡,就意味着要再同一台机器上运行多个 Tomcat Worker 并且能够在这些 worker 之间分布 Web 请求。可能还有很多很多要用到多个 Tomcat Worker 的原因,但是我想列出的这些就已经足够了 …… Tomcat workers 都定义在一个叫做 workers.properties 属性文件之中,并且 workers 的说明告诉应该如何使用它们。
站点间进行处理时彼此是完全独立的。我们想要提供负载平衡,就意味着要再同一台机器上运行多个 Tomcat Worker 并且能够在这些 worker 之间分布 Web 请求。可能还有很多很多要用到多个 Tomcat Worker 的原因,但是我想列出的这些就已经足够了 …… Tomcat workers 都定义在一个叫做 workers.properties 属性文件之中,并且 workers 的说明告诉应该如何使用它们。
定义
Workers
可以通过属性文件来为
Tomcat Web
服务器插件定义
Worker
。
(
在
conf/
下有个文件名为
wo
rkers.properties 就是一个可用 Workers 属性文件 ).
rkers.properties 就是一个可用 Workers 属性文件 ).
文件中有如下形式的条目
:
worker.list=<
由逗号分离开的
worker
名称列表
>
# the list of workers
(
worker
列表)
worker.list= worker1, worker2
worker.list= worker1, worker2
当启动服务器的时候,
Web
服务器插件会把这些出现在
worker.list
属性中出现名字的
w
orker 实例化,而这些也就是你可以用来映射请求的 worker 。
orker 实例化,而这些也就是你可以用来映射请求的 worker 。
ajp13
这种
worker
知道如何使用
ajpv13
协议去给用来外部处理的
worker
传递一个请求。
jni
这种
worker
知道如何使用
JNI
去给用来外部处理的
worker
传递一个请求。
lb
这是一个负载平衡
worker
;它知道怎样在一定容错范围内提供一个基于粘性负载的
循环。
status
这是一个状态
worker
来管理负载平衡。
定义一个
worker
的类型,应该使用如下的属性格式
:
worker. worker name.type=<worker type>
这里
worker
的名字是你已经分配给
worker
的,并且,
worker
的类型只能定义为下表四种类
型之一:(
worker
的名字中不能含有空格,对于一系列
worker
的好的命名规范应该遵从
Java
变量命名规则。)
#
定义了一个名为“
local
”,使用
ajp12
协议的
worker
来传递请求给
Tomcat
处理。
worker.local.type=ajp12
#
定义了一个名为“
remote
”,使用
ajp13
协议的
worker
来传递请求给
Tomcat
处理。
worker.remote.type=ajp13
#
定义了一个名为“
fast
”,使用
JNI
的
worker
来传递请求给
Tomcat
处理。
worker.fast.type=jni
#
定义了一个名为“
loadbalancer
”的
worker
,用来显式平衡若干
Tomcat
处理过程的负
载。
worker.loadbalancer.type=lb
ajp13 Worker
属性
ajp13
类型标记的
workers
使用
ajpv13
协议通过
TCP/IP
的服务套接字(
sockets
)来传递请求给
Tomcat
处理。
ajpv13
是一个变长字节协议。它依照使用频率最多的字符串编码为最小整数的方
式对请求数据做一定的压缩。
ajpv13
会重用打开的套接字,并且把他们保留给以后的请求
(
记住,这是当你的
Web
服务器和
Tomcat
之间有防火墙时
)
。
• ajpv13
针对
SSL
信息有专有的策略以便容器能够实现与
SSL
关联的方法,例如
isS
ecure()
。
你应该注意到
Ajp13
是
Tomcat 4.0.x, 4.1.x and 5
当前唯一支持的外部处理协议
。
# worker "worker2"
会与监听在名为
www2.x.com
的机器上的
8009
端口使用
3
个负载平
衡系数的
Tomcat
通信
worker.worker2.host=www2.x.com
worker.worker2.port=8009
worker.worker2.lbfactor=3
# worker "worker2"
用掉
10
个套接字
,
这些会保持不超过
10
钟的缓存
worker.worker2.cachesize=10
worker.worker2.cache_timeout=600
# worker "worker2"
会请求操作系统给连接(
connection
)发出
KEEP-ALIVE
信号
worker.worker2.socket_keepalive=1
# worker "worker2"
试图使
ajp13
连接于
5
分钟后断开
(
周期性的
)
worker.worker2.recycle_timeout=300
注意:在
ajpv13
协议中,默认的端口是
8009
。
负载平衡
Worker
(
lb Worker
)属性
负载平衡
worker
并不是真正的与
Tomcat
的其它
worker
通信,而是负责对若干“真实”的
workers
的管理。这些管理包括内容如下:
•
实例化
Web
服务器上的
worker
。
•
使用
worker
的负载平衡参数,在性能强的机器上运行有利于循环的负载平衡
(
这可
以处理更多的请求
)
•
在执行同一个
Tomcat Worker
时候保持针对同一个会话线程的请求。
•
认证失败的
Tomcat worker
,对他们的请求会被中止并会反馈给其他由
lb worker
管理的
worker
们,并由这些被管理的
worker
替代。
总之,结果就是,由同一个
lb worker
管理的
worker
会被平衡负载(这取决于他们的
lb fa
ctor
和当前用户会话线程)并且也被反馈,这样一个单独的
Tomcat
处理过程的死亡不会“
杀死”整个站点。下表详述了
lb worker
可接受的属性:
• balance_workers
是用逗号分隔负载平衡器所需管理的
worker
的名称。这些
work
er
不应该出现在
worker.list
属性中。
• sticky_session
指明带有会话线程
ID
的请求是否应该被发送回到同一个
Tomcat w
orker
。
sticky_session
是一个标记(
flag
),当且仅当会话线程是粘连的,其值为真(
T
rue
),否则其值为假(
false
)。只有当
Tomcat
使用一个会话线程管理器时,并且这个会
话线程管理器时能够在多个
Tomcat
实体之间相互持续传递数据,
sticky_session
被设定为
False
。默认的
sticky_session
的值是
True
。
例如
worker balance1
同时使用“真实”的
worker
——
worker1
和
worker2
:
worker.balance1.balance_workers=worker1, worker2
高级负载平衡
Worker
属性(
Advanced lb Worker properties
)
一个机群(
cluster
)有两个节点
(worker1+worker2)
,他们前后相继运着各自的
webserve
r+tomcat
,并且每个节点都有一个负载平衡器。
#
定义一个高级路由
LB worker
worker.list=router
#
定义一个使用
ajp13
的
worker
worker.worker1.port=8009
worker.worker1.host=node1.domain.org
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
#
给
worker1
定义了一个发生错误处理失败后要引用的节点
worker.worker1.redirect=worker2
#
定义另外一个使用
ajp13
的节点
worker.worker2.port=8009
worker.worker2.host=node2.domain.org
worker.worker2.type=ajp13
worker.worker2.lbfactor=1
#
除非发生了错误并且处理失败了,否则就禁用所有发给
worker2
的请求
worker.worker2.disabled=True
#
定义
LB worker
worker.router.type=lb
worker.router.balance_workers=worker1,worker2
Worker1
的
Redirect
标记告诉
lb_worker
只有当
worker1
在错误状态时才把请求重定向到
wo
rker2
。否则
worker2
不会接到任何请求,
worker2
就好像热备份一样。
状态
Worker
属性
(Status Worker properties)
状态
worker
并不与
Tomcat
通信,而是负责一个
lb worker
管理:
#
在
worker.list
中增加一个状态
worke r
worker.list=jkstatus
#
给
jkstatus worker
定义一个使用的状态
worker.jkstatus.type=status
下一件事情就是把请求挂载到
jkstatus worker
上。
对于
Apache Web Sever
我们这样使用:
#
添加
jkstatus
挂载点
JkMount /jkmanager/* jkstatus
要获取一个高级安全权限我们这样做:
#
让
JK
管理器只能从访问
localhost
访问
<Location /jkmanager/>
JkMount jkstatus
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
宏属性文件定义
你可以在属性文件中定义宏。这些宏允许你定义属性,并且在你后来构建其他属性时候使
用他们,而且在你改变你的
Java Home
,
Tomcat Home
或
OS
路径分隔符的时候,他们会变得非常有用。
#
属性例子
,
不要
hardcode
路径分隔符
ps=/
workers.tomcat_home=d:/tomcat
workers.java_home=d:/sdk/jdk1.2.2
#
通过使用宏,我们使得:
worker.inprocess.class_path=d:/tomcat/classes
改写为
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)classes
#
通过使用宏,我们使得:
worker.inprocess.class_path=d:/sdk/jdk1.2.2/lib/tool
s.jar
改写为
worker.inprocess.class_path=$(workers.java_home)$(ps)lib$(ps)tools.jar
worker.properties
例子
由于要应付你自己的
worker.properties
并不是件容易事,所以
JK
同时捆绑了一个
worker
.properties
。
你也可以找到一个
workers.properties
的例子,定义如下
:
• ajp13 worker
使用主机为
localhost
端口为
8009
• jni worker
• lb worker
平衡
ajp12
和
ajp13 worker
的负载
#
定义一些宏属性
workers.apache_log=/var/log/httpd/
workers.tomcat_home=/var/tomcat3
workers.java_home=/opt/IBMJava2-131/
ps=/
#
定义
4
个
workers
,
3
个实体
workers
分别使用
ajp12, ajp13, jni
,
最后一个作为负载
平衡
worker
worker.list=worker1, worker2, worker3, worker4
#
设置
worker1
的属性
(ajp12)
worker.worker1.type=ajp12
worker.worker1.host=locahost
worker.worker1.port=8007
worker.worker1.lbfactor=1
#
设定
worker2
的属性
(ajp13)
worker.worker2.type=ajp13
worker.worker2.host=locahost
worker.worker2.port=8009
worker.worker2.lbfactor=1
worker.worker2.cachesize=10
worker.worker2.cache_timeout=600
worker.worker2.socket_keepalive=1
worker.worker2.socket_timeout=60
#
设定
worker3
的属性
(jni)
worker.worker3.type=jni
#
设定
worker3
桥的类型,这里时
Tomcat3.3
worker.worker3.bridge=tomcat33
#
设定
worker3
目录
worker.worker3.class_path=$(workers.tomcat_home)$(ps)classes
worker.worker3.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar
#
设定
worker3 tomcat
命令行
worker.worker3.cmd_line=-home
worker.worker3.cmd_line=$(workers.tomcat_home)
#
设定
worker3 Tomcat/JVM
设置
worker.worker3.jvm_lib=$(workers.java_home)$(ps)jre$(ps)bin$(ps)classic$(ps)
libjvm.so
worker.worker3.stdout=$(workers.apache_log)$(ps)inprocess.stdout
worker.worker3.stderr=$(workers.apache_log)$(ps)inprocess.stderr
worker.worker3.sysprops=tomcat.home=$(workers.tomcat_home)
#
设定
worker4 (lb)
属性,用来使用
worker1
和
worker2
worker.worker4.balance_workers=worker1,worker2