一 简介
每个Tomcat worker是一个服务于web server 等待执行servlet的Tomcat实例 例如我们经常使用像Apache之类的web server转发sevlet请求给位于其后面的一个Tomcat进程(也就是前面所说的worker) 本文详细介绍了如何配置各种类型worker和 loadbalance 并说明了各种类型worker的特性和loadbalance配置的原理
二 为什么使用Tomcat workers
上文描述了一个非常简单的结构 事实上能够配置多个Tomcat workers来处理web server转发的servlet请求 而这样配置的理由不外乎以下几种假想环境
* 我们在开发环境中发布不同的Tomcat workers为各自不同的应用服务 当然在开发环境中的开发者共享同一个web server 但是每个Tomcat worke服务于拥有它的开发者
* 我们在不同的Tomcat进程上定义各自的虚拟主机 这样不同的公司可以使用各自的web site 从而使他们的web site得到了合理的分割
* 我们提供负载平衡的web site 也就意味着同时使用多个Tomcat workers 而每个Tomcat worker具有独立的主机并且在workers之间要分配通过web server转发来的请求
当然 这些假想情况也许并不能涵盖使用多个workers的所有状况
三 workers properties配置说明
定义Tomcat workers的方法是在apache的conf目录下编写一个名为 workers properties 的属性文件 本文将详细解释如何进行配置的
定义Workers列表
定义workers的方法就是在apache的conf目录下编写一个workers properties文件 使其作为apache的插件来发挥作用
定义workers列表的格式
worker list =<使用 分割的worker 名字列表>
例如
worker list= worker worker
当apache启动时 workers properties作为插件将初始化出现在worker list列表中的workers
定义Workers的类型
每个被命名的worker都应有一些关于其自身的附加信息 这些信息包括了worker的类型和其它相关信息 这里讨论的是JK 中定义的workers类型
定义worker类型的格式
worker worker名字 type =<worker类型>
worker名字的命名最好遵循java的命名规范
worker类型取值于下面的表格
定义一个名为 local 的worker 其使用ajpv 协议与Tomcat 进程通讯
worker local type=ajp
定义一个名为 remote 的worker 其使用ajpv 协议与Tomcat 进程通讯
worker remote type=ajp
定义一个名为 fast 的worker 其使用JNI的方式与Tomcat 进程通讯
worker fast type=jni
定义一个名为 loadbalancer 的worker 其作为对多个Tomcat 进程的负载平衡使用
worker loadbalancer type=lb
各个类型具有不同的行为 我们在下文中会详细解释
设置Worker属性
在定义worker之后 还需要提供各个worker的属性 这些属性的定义使用下面的方式
worker <worker名字><属性>=<属性值>
ajp 类型的Worker属性
ajp 类型的worker工作时使用基于TCP/IP socket的ajpv 协议转发请求给 进程外 Tomcat worker
ajp worker属性如下
host
侦听ajp 请求的Tomcat worker主机
port
Tomcat worker主机的侦听端口
lbfactor
当此Tomcat worker被用于一个负载平衡worker使用时 此属性将被使用 它定义了此worker的负载平衡权值
例如 下面的 worker 定义了一个位于主机上的Tomcat 它使用 端口侦听apache发来的请求 并具有 的负载权值
worker worker host=worker worker port= worker worker lbfactor=
注意 在ajpv 协议中 针对每个请求都要一个连接建立 使用 关闭 其默认侦听端口为
ajp 类型的Worker属性
ajp 类型的worker工作时使用基于TCP/IP socket的ajpv 协议转发请求给 进程外 Tomcat worker
ajpv 协议与ajpv 协议的主要不同
* ajpv 具有更丰富的二进制协议 它使用将频繁使用的字符串编码为小整数的方式对请求数据进行压缩
* ajpv 重用打开的socket并保留这些打开的socket以处理将来的请求 这在apache与Tomcat之间具有防火墙的网络环境下是必要的
* ajpv 具有对SSL信息的处理能力 以致容器能够实现SSL的相关方法(如isSecure())
注意 ajp 当前只能用于支持 进程外 协议的Tomcat x x and
下表描述了ajp worker接受的属性
host
侦听ajp 请求的Tomcat worker主机
port
Tomcat worker主机的侦听端口
lbfactor
当此Tomcat worker被用于一个负载平衡worker使用时 此属性将被使用 它定义了此worker的负载平衡权值
cachesize
当在多线程的web server(例如apache IIS Netscape)中使用JK时 此属性是有效的 如果将cachesize的值设置为较高的值 这些支持多线程的web server将获得很好的处理能力 如果此属性不被设置 则连接cache特性将失效
cache_timeout
本属性用于声明JK在cache中保留一个打开的socket的时间 它对减少web serer的线程数有所帮助
使用cache_timeout的原因
周所周知 一个身背重负的web server(例如apache)建立childs/threads来处理负载 而当负载减少时它将销毁无用的childs/threads 每个 child在转发请求给Tomcat时要打开一个ajp 连接 而在Tomcat那一端也将建立一个ajp 线程与之通讯 但是问题出现在一个 ajp 连接建立完成后 child没有及时的释放那个ajp 连接 由于web server 将保持它的childs/threads运行已处理高负载 即使childs/threads处理快速的静态内容 在Tomcat端也将积累很多的无用ajp 线程
socket_keepalive
当防火墙位于web server与Tomcat之间时 防火墙将尝试断开未激活的网络连接 此属性将告诉 *** 作系统在未激活的连接中发送KEEP_ALIVE信息(发送间隔时间依赖于 *** 作系统的设置 一般为 秒) 这样将防止防火墙切断未激活的网络连接
但此设置并不是万能钥匙 它对于某些防火墙也无能为力
socket_timeout
此属性说明连接在未激活的状况下持续多久 web server将主动切断之 这是一个使Tomcat端的陈旧线程不致过多的好方法 但是也带来了在下一次请求到来时需要重新打开socket的开销 此属性与cache_timeout有类似的功效 但是它工作在non cache模式
connect_timeout
web server在连接建立后将一个PING请求发送到ajp 协议的连接上 此属性说明了web server等待PONG回应的时间(以ms为单位) 此属性在jk 版本被增加进来 以求避免Tomcat的死机 Tomcat + + and +实现了对使用ajp 的 ping/pong的支持 此属性默认为失效的
prepost_timeout
web server在转发一个请求后将一个PING请求发送到ajp 协议的连接上 此属性说明了web server等待PONG回应的时间(以ms为单位) 此属性在jk 版本被增加进来 以求避免Tomcat的死机 Tomcat + + and +实现了对使用ajp 的 ping/pong的支持 此属性默认为失效的
reply_timeout
此属性告诉web server在接到远端的Tomcat已死并实时的切换到集群中的另外一个Tomcat的回应之前等待一段时间 默认情况下web server将永远等待 属性值为web server要等待回应的时间(以ms为单位) 所以如果具有运行时间较长的servlet时设置其值要小心 此属性在jk 版本被增加进来 以求避免Tomcat的死机和在支持ajp 的servlet引擎上发生的问题 此属性默认为失效的
recovery_options
此属性说明了web server在检测到Tomcat失败后如何进行恢复工作 默认情况下 web server将转发请求给处于负载平衡模式中的另一个Tomcat 属性值为 说明全部恢复 属性值为 说明如果在Tomcat接到请求后出现失败状况 则不进行恢复 属性值为 说明如果在Tomcat发送头给客户端后出现失败状况 则不进行恢复 属性值为 说明如果在Tomcat接到请求后出现失败状况或者在Tomcat发送头给客户端后出现失败状况 则不进行恢复 此属性在jk 版本被增加进来 以求避免Tomcat的死机和在支持ajp 的servlet引擎上发生的问题 此属性默认为全部恢复
例如 一个名为 worker 的worker的配置
worker worker host=worker worker port= worker worker lbfactor= worker worker cachesize= worker worker cache_timeout= worker worker socket_keepalive= worker worker want ajp connection to be dropped after mn (timeout)worker worker socket_timeout=
说明 上例中的worker要求 *** 作系统在连接上发送KEEP ALIVE信号
注意 在ajpv 协议中默认端口为
设置lb Worker属性
负载平衡类型的worker并不与Tomcat worker通讯 它负责管理这些Tomcat worker
其管理范围如下
* 初始化在web server的worker列表中定义的worker
* 使用worker的负载平衡权值 执行基于权值的负载平衡 将数量多的请求发送到负载平衡权值高(在web server看来就是更加健壮的)的worker
* 维护在同一个Tomcat worker上的同一个session的请求 使其发送到同一个Tomcat worker上 以达到Tomcat worker上的session一致性 持续性
* 标识已经失败的Tomcat workers 悬空发向它们的请求 在被lb worker管理的其它workers上寻找可以失败恢复的worker
被同一个lb worker管理多个worker之间的负载平衡的(基于它们的lbfactor和当前用户session) 也可以尽量避免由于单一的Tomcat进程死掉而造成这个网站被 杀 的不良反应
下表说明了lb worker接受的属性
* balanced_workers 一个由 分割的worker列表 用来声明lb worker需要被管理的workers 这些workers不应出现在worker list属性中
* sticky_session 表述是否将对SESSION ID的请求路由回到相同的Tomcat worker 如果属性值不为 它将被设置为JK_TRUE session将是粘性的 即SESSION ID的请求路由回到相同的Tomcat worker 当Tomcat正使用能够跨越多个Tomcat实例持久化session数据的Session Manager时 它将被设置为JK_FALSE 属性默认值为JK_TRUE
例如 worker balance 管理著两个workers worker worker
worker balance balanced_workers=worker worker高级lb Worker属性
JK x版本通过增加两个新的属性 local_worker_only 和 local_worker 为lb worker增添了新的负载平衡和容错支持
下面让我们举一个实际的环境作为example
一个集群具有两个节点(worker +worker ) 一个web server与tomcat workers一前一后 一个负载平衡器(lb Worker)位于节点的前面 web server的后面
配置如下
worker list=router# Define a local_worker worker using ajp worker worker port= worker worker host=worker worker type=ajp worker worker lbfactor= worker worker local_worker= # Define another local_worker worker using ajp worker worker port= worker worker host=worker worker type=ajp worker worker lbfactor= worker worker local_worker= # Define the LB workerworker router type=lbworker router balanced_workers=worker worker worker router local_worker_only=
在worker 和worker 上的local_worker标志告诉lb_worker哪个连接属于本地worker
如果 local_worker值为非 则它将被设置为JK_TRUE 用来标记 local worker 而JK_FALSE的情况则相反 如果至少一个worker被标记为local worker 则lb_worker将工作于local worker模式 这种模式下 所有的local workers将被移到在lb_worker中的内部worker列表的头部
这意味着一个带有session id的请求到达lb_worker时 相应的worker(根据权值排序 权值最大的那个worker)将被确定作为此请求的接受/处理者 如果这个 worker死掉/当机 请求将被发送到处于非错误状态的第一个local worker 如果一个没有session id的请求到达lb_worker时 此请求将被路由到第一个local worker 如果所有的local worker均处于错误状态 则这时 local_worker_only 标志显得尤其重要 如果local_worker_only的属性值为非 则它被设置为 JK_TRUE 否则被设置为 JK_FALSE 当它被设置为 JK_TRUE时 这个没有session id的请求将得到一个错误作为回应 否则lb_worker将尝试将请求路由到其它的被管理的worker上 如果其中的一个worker处于错误状态 并且恢复会话的工作并没有任何改变 local worker将查找这个没有session id的请求(因为在local worker中保存有这个请求的session) 而其它的worker只能查找带有session id的请求
注意 local_worker默认值是 local_worker_only默认值也是
为什么需要这么复杂的过程吗?
因为我们对于一个关闭的节点需要一个具有灵性的维护
在节点前面的平衡器周期性的对每个节点的特定端口进行查询 如果我们从集群中移走一个节点 我们就会隐性的关闭掉这个特定的端口 由于负载平衡器不能连接它 这个节点将被标记为down 但是我们没有移动在那个关闭的节点上的session到其它的节点上 在这个环境下 如果平衡器发送一个没有 session id的请求到一个端口被关掉的节点 那么一个错误将发生 如果平衡器测试到一个节点被标记为down的状态 而没有其它的节点允许发送没有session id的请求 这样这些陈旧的session请求就只有路由到那个被关闭的节点才能被接受 在一段时间后 这些陈旧的session将超时 由于所有的陈旧的session过期 那个不可达(被关闭)的节点将失去这个请求 同时也会导致我们的servlet系统发送一个没有session id的重定向回应给浏览器
但是可能被关闭的节点将会up 重新加入到集群中来 在它上面仍将保留着陈旧的session 所以在最后一个 session超时后 更新节点能够为陈旧的session的恢复带来希望 而不是杀掉sessions或者把它们移到其它节点上 而且有时如果那些陈旧的session中有许多big的对象 那么移动它们也将花费许多时间
jni类型的Worker属性
jni worker会在web server进程中打开一个JVM 并在其中执行Tomcat 这叫做 进程内 worker 来往于JVM的消息将通过调用JNI方法被传递 这使jni worker比那些需要使用ajp消息通讯的 进程外 worker执行的更快
注意 由于JVM是多线程的 jni worker应该只被用于在支持对线程的web server(AOLServer IIS Netscape and Apache )上 同时还应该确认在web server上使用的线程方案是否与被使用的JK web server插件相匹配
由于jni worker 打开了一个JVM 它将接受一些属性(例如classpath等)并将其传递给JVM
worker worker名 class_path 进程内 的JVM要使用的classpath 它将包括所有的Tomcat的jar文件和class 配置文件等
为了获得JSP编译器的支持 我们需要将Javac添加到classpath中 当然对于Java 需要添加tools jar到classpath 而对于JDK xx则要添加classes zip到classpath
worker worker名 class_path 用于以多行的形式声明多个classpath JK环境将用 或者 把这些classpath 连接起来
例如 给名为 wrkjni 的worker设置classpath
worker wrkjni class_path=/var/tomcat /lib/tomcat jarworker wrkjni class_path=/opt/IBMJava /lib/tools jar
worker worker名 bridge 用于标识将通过JNI方式被使用的Tomcat的类型 此属性目前有两个属性值 tomcat or tomcat Tomcat x虽然已经过时 但是被提供用于发布在一些类似iSeries系统上 此属性的默认值为tomcat
例如 给 wrkjni 设置bridge类型为tomcat
worker wrkjni bridge=tomcat
worker worker名 cmd_line 此属性提供了在Tomcat启动代码执行的命令行 使用时将命令行的命令 参数分解为多个cmd_line属性 JK环境通过在各个cmd_line属性值之间添加空格将这些cmd_line连接在一起
例如 设置 wrkjni 的cmd_line属性
worker wrkjni cmd_line= configworker wrkjni cmd_line=/etc/tomcat /conf/alt server xmlworker wrkjni cmd_line= homeworker wrkjni cmd_line=/var/tomcat
上面例子中的第一行声明了 config参数名 而第二行声明了与之对应的参数值 第三行与第四行同理
worker worker名 jvm_lib 用于声明JVM的实现库的完整路径 Jni worker使用这个路径动态装载JVM
例如 设置 wrkjni 的JVM shared lib (IBM SDK on Linux)
worker wrkjni jvm_lib=/opt/IBMJava /jre/bin/classic/libjvm so
例如 设置 wrkjni 的JVM shared lib (Sun SDK on Windows)
worker wrkjni jvm_lib=c:\JDK\ \jre\bin\classic
worker worker名 stdout 设置JVM写它的System out的完整路径位置
例如 将 wrkjni 的JVM系统输出路径设置为/var/log/
worker wrkjni stdout=/var/log/
worker worker名 stderr 设置JVM写它的System err的完整路径位置
例如 将 wrkjni 的JVM系统错误输出路径设置为/var/log/
worker wrkjni stderr=/var/log/
worker worker名 ms 设置JVM的初始堆大小
例如 设置 wrkjni 的JVM的初始堆为 M
worker wrkjni ms=
worker worker名 mx 设置JVM的最大的堆大小
例如 设置 wrkjni 的JVM堆最大为 M
worker wrkjni mx=
worker worker名 sysprops 设置JVM的系统属性
例如 设置 wrkjni 的JVM使用法语
worker wrkjni sysprops= Duser region=FR
worker worker名 ld_path 设置附加的动态链接库路径(类似于LD_LIBRARY_PATH)
例如 添加一些动态链接库路径到 wrkjni 的java环境中
worker wrkjni ld_path=/opt/IBMJava /jre/bin/worker wrkjni ld_path=/opt/IBMJava /jre/bin/classic
注意 在Linux下 上面的ld_path并不能更新LD_LIBRARY_PATH 所以需要在执行web server之前手动更新LD_LIBRARY_PATH
属性文件宏
我们可以在属性文件中定义 宏 这些宏让我们定义属性 并在以后使用它们来构建其它的属性文件 当我们修改Java Home Tomcat Home 系统路径分隔符时这是很有用的
例如 定义了属性workers tomcat_home workers java_home
workers tomcat_home=d:\tomcaorkers java_home=d:\sdk\jdk
在定义worker inprocess class_path时就可以使用前面定义的workers tomcat_home
worker inprocess class_path=$(workers tomcat_home)$(ps)classes
一个简单而完整的worker properties
文件中定义了比较完整的结构 可以做为参考模版
* 一个位于localhost的使用 端口的ajp worker
* 一个位于localhost的使用 端口的ajp worker
* 一个jni worker
* 一个lb worker 负责ajp worker ajp workers的负载平衡
文件内容如下
lishixinzhi/Article/program/Java/ky/201311/28541apache安装目录为APACHE_HOME
tomcat安装目录为TOMCAT_HOME (要设到环境变量中)
jdk安装目录为JAVA_HOME(要设到环境变量中)
1.安装apache:(假定安装目录为APACHE_HOME,根据你实际安装自行替换)
废话不多说,安装后修改APACHE_HOME/CONF/httpd.conf 以下6个地方:
1) Port 8080 或者80 随你
2) ServerName localhost
3) DocumentRoot "e:/www" (为了发布方便,不如自己建个目录作为文档根)
4) 把原来的<Directory "APACHE_HOME/htdocs">改为
<Directory "e:/www">
5) 添加index.jsp为缺省的主索引文件
<IfModule mod_dir.c>
DirectoryIndex index.html index.jsp
</IfModule>
6) 这是最关键一步,在httpd.conf最后加上
#tomcat支持
include TOMCAT_HOME/conf/mod_jk.conf-auto
只需要这一句就够了,别听那些白痴的话,加上什么tomcat-apache.conf,那没用.
把mod_jk.dll拷贝进APACHE_HOME/module目录
这会先不管apache了,来设置tomcat3.2
步骤:
把tomcat解压缩,将它真正的目录jarakar-tomcat拷贝到你要的目录名TOMCAT_HOME
修改TOMCAT_HOME下的conf目录中的server.xml
1) 如果你不想看TOMCAT启动信息,这么做:
<Logger name="tc_log"
path="logs/tomcat.log"
verbosityLevel = "INFORMATION"
/>
增加一个PATH="logs/tomcat.log" 就可以了
2) 让tomcat改到8081上,一般来说www服务在80或者8080上:
<!-- Normal HTTP -->
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
<Parameter name="handler"
value="org.apache.tomcat.service.http.HttpConnectionHandler"/>
<Parameter name="port" value="8081"/>
</Connector>
3)增加APJ13协议支持
<!-- Apache AJP13 support. This is also used to shut down tomcat. -->
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
<Parameter name="handler" value="org.apache.tomcat.service.connector.Ajp13
ConnectionHandler"/>
<Parameter name="port" value="8009"/>
</Connector>
就放在原来的APJ12连接器后面就可以了
4)配合APACHE修改文档根目录
<!-- 文档根目录 -->
<Context path="/" docBase="e:/www" >
</Context>
5)为了用例子测试,还得改一下EXAMPLES的CONTEXT:
<Context path="/examples"
docBase="TOMCAT_HOME/webapps/examples" crossContext="false" >
</Context>
要使用MOD_JK还得改一下同一目录下的WORKERS.PROPERTIES文件:
1) workers.tomcat_home=TOMCAT_HOME
2) workers.java_home=JAVA_HOME
3) ps= 我爱windows 赫赫
现在ok了,开始启动!
别慌,还有启动顺序问题,注意啊,先启动tomcat让它自己修改一下配置,第一次一定
要先tomcat,以后除非修改tomcat的设置,都可以先启动apache了。
ok 来启动tomcat:运行TOMCAT_HOME/bin下面的startup.bat
看到:Startting tomcat. Check logs/tomcat.log for error messages.那就对了
再来检查tomcat的情况
先随便在e:www里面放个index.jsp文件,内容是
JAVA天堂
<%="啊哈!jsp第一次运行!"%>
用浏览器打开http://localhost:8081
如果看到上面的话出现,那么根文档就成功了,再来用例子测试一下,用浏览器打开:
http://localhost:8081/examples/jsp
运行猜数字游戏,如果正确了,说明咱们的examples上下文也关联正确。这就简单了。
剩下就是运行apache了
运行apache,看到这么一行:
Apache/1.3.14 (win32) with mod_jk running...那就对了
再来测试它们的组合,用浏览器打开http://localhost:8080(我假设你用8080端口,如
果是80端口,那就用http://localhost
还是看到那句“啊哈!jsp第一次运行!”
这就说明apache和tomcat连上了!
一、安装JDK和Tomcat
1,安装JDK:直接运行jdk-7-windows-i586.exe可执行程序,默认安装即可。
备注:路径可以其他盘符,不建议路径包含中文名及特殊符号。
2、安装Tomcat:直接解压缩下载文件“apache-tomcat-7.0.33-windows-x86.zip”到C盘下。安装路径建议修改为:c:\tomcat。
备注:如下载的是可执行文件,双击运行,默认安装即可。
二、配置JDK环境变量(在步骤查看如何配置环境变量)
1,新建变量名:JAVA_HOME,变量值:C:\Program Files\Java\jdk1.7.0
2,打开PATH,添加变量值:%JAVA_HOME%\bin%JAVA_HOME%\jre\bin
3,新建变量名:CLASSPATH,变量值:.%JAVA_HOME%\lib\dt.jar%JAVA_HOME%\lib\tools.jar
备注:
1,.表示当前路径,%JAVA_HOME%就是引用前面指定的JAVA_HOME;
2,JAVA_HOME指明JDK安装路径,此路径下包括lib,bin,jre等文件夹,tomcat,eclipse等的运行都需要依靠此变量。
3,PATH使得系统可以在任何路径下识别java命令。
4,CLASSPATH为java加载类(class or lib)路径,只有类在classpath中,java命令才能识别。
三、测试JDK
在CMD命令下输入javac,java,javadoc命令:出现图示界面,表示安装成功。
四、配置Tomcat环境变量
1,新建变量名:CATALINA_BASE,变量值:C:\tomcat
2,新建变量名:CATALINA_HOME,变量值:C:\tomcat
3,打开PATH,添加变量值:%CATALINA_HOME%\lib%CATALINA_HOME%\bin
五、启动Tomcat服务
方法三种:
1,方法一:直接进入tomcat的bin目录中点击startup.bat启动服务,出现如下对话框,表明服务启动成功,stutdown.bat为关闭服务。
2,方法二:在CMD命令下输入命令:startup,出现如下对话框,表明服务启动成功。
3,方法三:右键点击桌面上的“我的电脑”->“管理”->“服务和应用程序”->“服务”,找到“Apache Tomcat”服务,右键点击该服务,选择“属性”,将“启动类型”由“手动”改成“自动”。
六、测试Tomcat
打开浏览器,在地址栏中输入http://localhost:8080回车,如果看到Tomcat自带的一个JSP页面,说明你的JDK和Tomcat已搭建成功。
注意事项
1,JAVA_HOME中的路径不能用分号结尾,如C:\Program Files\Java\jdk1.7.0。
2,CATALINA_BASE,CATALINA_HOME,TOMCAT_HOME中的路径不能以“\”结尾。
3,JAVA_HOME的路径一定不要写成了JRE的路径。
4,在环境变量中修改添加变量时,一定要注意分号、空格,是否有多余的字母。作者就是因为path路径中多了一个字母,怎么都配置不成功。如果配置不成功,一定要反复检查。
以上错误,非常容易出现错误:CATALINA_HOME或是JAVA_HOME没有配置好。如错误提示“The CATALINA_HOME environment variable is not defined correctly”
项目部署方式
一、静态部署
1、直接将web项目文件件拷贝到webapps 目录中
Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用。所以可以将JSP程序打包成一个 war包放在目录下,服务器会自动解开这个war包,并在这个目录下生成一个同名的文件夹。一个war包就是有特性格式的jar包,它是将一个web程序的所有内容进行压缩得到。具体如何打包,可以使用许多开发工具的IDE环境,如Eclipse等。也可以用 cmd 命令:jar -cvf mywar.war myweb
webapps这个默认的应用目录也是可以改变。打开Tomcat的conf目录下的server.xml文件,找到下面内容:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
将appBase修改即可。
2、在server.xml中指定
在Tomcat的配置文件中,一个Web应用就是一个特定的Context,可以通过在server.xml中新建Context里部署一个JSP应用程序。打开server.xml文件,在Host标签内建一个Context,内容如下。
在tomcat中的conf目录中,在server.xml中的,<host/>节点中添加:
<Context path="/hello" docBase="D:\ workspace\hello\WebRoot" debug="0" privileged="true">
</Context>
或者
<Context path="/myapp" reloadable="true" docBase="D:\myapp" workDir="D:\myapp\work"/>
或者
<Context path="/sms4" docBase="D:\workspace\sms4\WebRoot"/>
说明:
path是虚拟路径;
docBase 是应用程序的物理路径;
workDir 是这个应用的工作目录,存放运行时生成的与这个应用相关的文件;
debug 则是设定debug level, 0表示提供最少的信息,9表示提供最多的信息
privileged设置为true的时候,才允许Tomcat的Web应用使用容器内的Servlet
reloadable 如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重起tomcat的情况下改变应用程序,实现热部署
antiResourceLocking和antiJARLocking 热部署是需要配置的参数,默认false避免更新了某个webapp,有时候Tomcat并不能把旧的webapp完全删除,通常会留下WEB-INF/lib下的某个jar包,必须关闭Tomcat才能删除,这就导致自动部署失败。设置为true,Tomcat在运行对应的webapp时,会把相应的源文件和jar文件复制到一个临时目录里。
3、创建一个Context文件
在conf目录中,新建 Catalina\localhost目录,在该目录中新建一个xml文件,名字不可以随意取,要和path后的那个名字一致,按照下边这个path的配置,xml的名字应该就应该是hello(hello.xml),该xml文件的内容为:
<Context path="/hello" docBase="E:\workspace\hello\WebRoot" debug="0" privileged="true"></Context>
tomcat自带例子如下:
<Context docBase="${catalina.home}/server/webapps/host-manager"
privileged="true" antiResourceLocking="false" antiJARLocking="false">
</Context>
这个例子是tomcat自带的,编辑的内容实际上和第二种方式是一样的,其中这xml文件名字就是访问路径,这样可以隐藏应用的真实名字。
4、注意:
删除一个Web应用同时也要删除webapps下相应的文件夹和server.xml中相应的Context,还要将Tomcat的conf\catalina\localhost目录下相应的xml文件删除,否则Tomcat仍会去配置并加载。。。
二 动态部署
登陆tomcat管理控制台:http://localhost:8080/,输入用户名和密码后便可管理应用并动态发布。
在Context Path(option):中输入/yourwebname ,这代表你的应用的访问地址。
XML Configration file URL中要指定一个xml文件,比如我们在F:\下建立一个hmcx.xml文件,内容如下: <Context reloadable="false" />其中docBase不用写了,因为在下一个文本框中填入。或者更简单点,这个文本框什么都不填,在WAR or Directory URL:中键入F:\hmcx即可,然后点击Deploy按钮,上面就可以看到了web应用程序,名字就Context Path(option):中的名字。
如果部署.war文件还有更加简单的方式,下面还有个Select WAR file uploae点击浏览选择.war文件,然后点击Deploy也可以。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)