Tomcat6上部署应用配置详解

原文出处:http://blog.lihai.me/deploy-webapp-on-tomcat.html

本文的主要内容是关于Tomcat上部署应用,因此Tomcat的安装及其他基本JavaEE中的概念就不多说了。由于从Tomcat4.x到Tomcat6.x的配置变化不大,因此本文以Tomcat 6进行介绍。

在真正开始配置之前,我们先了解下与路径关系密切的一些知识。

0.CATALINA_HOME、CATALINA_BASE及Tomcat实例(Tomcat Instance)

CATALINA_HOME与CATALINA_BASE这两个环境变量是Tomcat启动时要用到的。

其中CATALINA_HOME主要用来指明Tomcat核心运行文件及核心库文件的位置,bin,lib文件夹的位置由这个变量计算得来。CATALINA_BASE则用来指明Web应用(Web applications)位置及Tomcat实例相关配置文件的位置。work,logs,temp,webapps,conf文件夹的位置由这个变量计算得来。

但也可以不配置这两个环境变量,默认情况下Tomcat会根据启动脚本的位置来推断这两个环境变量,这时会有$CATALINA_HOME=$CATALINA_BASE=Tomcat的安装目录。

一个Tomcat实例对就对应一个不同的Tomcat配置,多个部署在其上的应用,及相关的其他文件。

使用这两个变量可以让我们既可以同时运行多个不同配置的Tomcat实例,又可以对Tomcat的核心配置,Jar包等进行集中管理,比如配置集群时或者是对多个Tomcat实例都配置Log4j等时,库文件就可以在$CATALINA_HOME/lib下集中管理。

配置多个Tomcat实例的具体做法就是

  1. 将Tomcat目录下除bin,lib文件夹外复制一份到新目录,这个目录就是$CATALINA_BASE。
  2. 在$CATALINA_BASE下建立bin文件夹,将$CATALINA_HOME/bin下的startup.bat,shutdown.bat脚本复制到$CATALINA_BASE/bin下面,然后在这两个文件加上两行
    SET CATALINA_HOME=Tomcat的安装目录,如SET CATALINA_HOME=C:\program files\tomcat
    SET CATALINA_BASE=Tomcat新实例的目录,如SET CATALINA_BASE=C:\tomcat-copy
  3. 修改配置文件使得他们提供服务端口不一样(详见后面配置端口部分),然后就可以同时启动多个Tomcat实例了。

注意:在步骤1中不要拷贝lib下的内容,因为$CATALINA_BASE/lib下内容优先于$CATALINA_HOME/lib下内容加载,除非特别必要,不要在$CATALINA_BASE下放内容,以免冲突。

由于部署应用的大多情况下是配置$CATALINA_BASE/conf/server.xml,先给出server.xml的大致结构(无关部分被略去)。

1
2
3
4
5
6
7
8
9
10
11
<Server port="8006" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
<Engine defaultHost="localhost" name="Catalina">
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"
xmlNamespaceAware="false" xmlValidation="false">
<Context path="/test" docBase="test"/>
</Host>
</Engine>
</Service>
</Server>

1.部署应用,配置Context,部署为根目录(appname部分)

这个appname就是所说的Contex,一个应用对应一个Contex。将一个应用部署到Tomcat有这么几种方法。

1.最常用的就是直接把WAR包或者文件夹直接放到webapps目录下面,这时Context就是WAR包或者文件夹的名称。

如果需要配置为根目录(context为空,即http://localhost:8080/ 形式),则需要将WAR包重命名为ROOT.WAR或者将文件夹重命名为ROOT。

这种方式是因为在webapps这个目录下的所有WAR包或者应用文件夹(Web archive)在Tomcat启动时就会被自动发布。

需要注意的是webapps其实是Host节点appBase属性的值,相对路径是相对于$CATALINA_BASE的,即$CATALINA_BASE/webapps,也可以配置为其他的值,或者一个绝对路径,这样那个目录下的WAR包或者文件夹都会在Tomcat启动时被自动发布。

2.在Host节点下面增加一个Context节点,一个Host节点可以包含多个Context节点。

<Context path="/test" docBase="test"/>其中path就是Context,如果要配置根目录,需要有path=””。

这里的docBase就是文件夹名称或者是WAR包名,如果是相对路径,则是相对于它所在Host节点的appBase,如果是绝对路径,就要写完整。

注意

  1. 不要将docBase指向webapps下的某个WAR或者文件夹,这样可能会导致应用被多次发布。
  2. 以这种方式发布应用,需要重启Tomcat才能生效。

3.在$CATALINA_BASE/conf/[enginename]/[hostname],默认是$CATALINA_BASE/conf/Catalina/localhost下面添加一个[appname].xml。

这时Context就是这个xml文件的名字,这个xml文件的内容就是上面的Contex节点,其中path属性不要指定,因为它是由xml文件名指定的。

这种方法的好处就是不用重启Tomcat部署生效。

注意:和上面一样不要把docBase指向webapps下的某个WAR包或者文件夹。

4.使用Tomcat Manager进行部署。这种方式进行配置也可以在不重启Tomcat的情况下进行部署,这种方式比较直观就不再解释。

注意:

  1. 网上流传的在$CATALINA_BASE/webapps下面添加一个[appname].xml文件进行部署的方式经验证及查资料,我认为是错误的,在Tomcat的文档中没有看到有这么一句话。
  2. 强烈不推荐以WEB application/META-INF/context.xml方式配置Context, 一是不方便部署(如果改Context还要重新打包),二是容易与前面几种方式发生冲突。

主要参考链接:http://tomcat.apache.org/tomcat-6.0-doc/index.html(后面配置也主要参考这个)

2.配置端口(8080部分)

我们改的最多的就是服务的端口。改下Connector节点中port的值就可以了(建议为1024以上)。

如果我们希望只启动一个Tomcat,同时在多个端口提供网络服务,那么就需要增加一个Service节点并相应地改动相关值。即

1
2
3
4
5
6
7
8
9
<Service name="Catalina">
<Connector connectionTimeout="20000" port="8082" protocol="HTTP/1.1" redirectPort="8443"/>
<Engine defaultHost="localhost" name="Catalina">
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"
xmlNamespaceAware="false" xmlValidation="false">
<Context path="/test" docBase="test"/>
</Host>
</Engine>
</Service>

注意:在同一个server.xml中其中Service的name和Engine的name必须是唯一的。

3.配置虚拟主机(localhost部分)

我们可以在一个Tomcat实例上运行多个网站,每个网站又可以配置多个应用,即使用虚拟主机,这时我们相应地增加Host节点,如

1
2
3
4
5
6
7
8
9
<Host appBase="aaa" autoDeploy="true" name="www.aaa.com" unpackWARs="true"
xmlNamespaceAware="false" xmlValidation="false">
<Context path="/test" docBase="test"/>
</Host>

<Host appBase="bbb" autoDeploy="true" name="www.bbb.com" unpackWARs="true"
xmlNamespaceAware="false" xmlValidation="false">
<Context path="/test" docBase="test"/>
</Host>

如果是使用Windows进行本地测试,则还要在C:\WINDOWS\system32\drivers\etc\host中添加两行

1
2
127.0.0.1 www.aaa.com
127.0.0.1 www.bbb.com

这样的话,对www.aaa.com和www.bbb.com的访问都会转到你本机上,然后Tomcat就会根据请求URL中的Hostname做出相应的判断,即对www.aaa.com:8080/test的访问实际是访问$CATALINA_BASE/aaa/test的访问,而对www.bbb.com:8080/test的访问实际是对$CATALINA_BASE/bbb/test的访问。

注意

  1. Hostname也可以是IP地址,这样就可以以根据不同的IP地址来做转向。
  2. Engine有一个defaultHost属性,就是说如果请求URI的Hostname不在server.xml中时默认转向的那个Host.例如,服务器公网IP是1.2.3.4,server.xml中只有两个Host节点,name分别为www.aaa.com和www.bbb.com,Enginer的defaultHost为www.aaa.com。当有人访问1.2.3.4/test时,Tomcat找不到对应的Host,就会转向为www.aaa.com/test
  3. 需要注意增加Service节点与增加Host节点对前面所述第三种部署应用方式的影响。第三种方式中[appname].xml需要放到$CATALINA_BASE/conf/[enginename]/[hostname]下面,因此如果以这种方式部署应用,就要根据实际情况来建立相应的文件夹,如$CATALINA_BASE/conf/Catalina/www.aaa.com。

4.配置http或者https(http部分)

默认情况下Tomcat只在8080端口提供HTTP服务,如果需要HTTPS服务,则要进行配置。

首先需要用JDK自带的工具生成key文件,

JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA -keystore C:\tomcat.key

然后在server.xml中Service下面添加一个Connector 节点

1
2
3
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" keystoreFile="C:/tomcat.key"/>

keystoreFile指向刚才生成的keyFile的位置,其他的不用修改。

重启Tomcat,就可以https方式访问了,即https://localhost:8843/

参考链接:http://tomcat.apache.org/tomcat-5.0-doc/ssl-howto.html

5.杂项:Eclipse WTP与Tomcat

最后简单说下Eclipse如何进行Tomcat配置,使用的插件是WTP(Eclipse JavaEE自带)。

Eclipse WTP根据在服务器视图配置界面(双击Server视图中Tomcat出现)中Server Location选择的不同(如下图),配置不同的$CATALINA_BASE。

如果选择第二项,就有$CATALINA_BASE=$CATALINA_HOME,否则$CATALINA_BASE就是你指定的路径,选择第一项WTP会帮你创建相应的目录,选择第三项需要自己创建相应的目录。

选择第一或三项的情况下就相当于有一个新的Tomcat实例,对Eclipse中Tomcat配置的改动就不会影响Tomcat安装目录中的配置,而第二项则会影响Tomcat安装目录中的配置。因此如果选择第一项或者第三项,在Eclipse外启动Tomcat安装目录中的实例,在Eclipse中发布在Tomcat的应用就不会被发布。

较复杂的配置是需要通过配置文件进行配置的。在Eclipse中有个工程叫Server,下面每个目录都对应一个服务器实例的配置文件的拷贝。在这里的配置文件做改动保存后,然后在Server上右键选择Publish后就可以将配置同步到Tomcat实例中配置文件上。如图

但是通过图形界面配置的东西,不需要Publish这个过程

另外需要注意的一点是在Server Option中有一个选项是:Publish module contexts to separate XMLs,如果勾上就是选择部署应用的第三种方式,如果不勾就是部署应用的第二种方式。

展开阅读全文

没有更多推荐了,返回首页