简单部署流程:
1,解析域名关联到服务器ip
2,配置服务器jre运行环境
3,安装tomcat
4,项目打war包,放入tomcat根目录下webapps(tomcat默认加载的项目目录)目录下
5,启动运行
Tomcat增加Context配置导致启动的时候项目加载两次
Tomcat排雷笔记
1. 出现场景
eclipse发布web应用至tomcat,默认方式下访问该项目是需要带项目名称的,例http://localhost:8080/myapp/。
现在需要改成这样访问http://localhost。
修改tomcat的server.xml文件,增加如下配置<Context path="" docBase="myapp" reloadable="false"/>
,修改后host部分如下:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <Context path="" docBase="myapp" reloadable="false"/> </Host>
此时每次启动tomcat观察日志都会发现应用加载了两次,什么原因呢?
2. 问题原因
虚拟目录引起的问题,我们在Host标签里配置了appBase="webapps",tomcat加载一次应用。在里配置了一次docBase,tomcat又去加载一次应用。
3. 解决办法
将appBase="webapps"置为appBase="",docBase="myapp"置为docBase="webapps/myapp"。配置如下:
<Host name="localhost" appBase="" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <Context path="" docBase="webapps/myapp" reloadable="false"/> </Host>
说明:如果你的项目中的链接或者图片写的都是绝对路径的话,那么带有项目名称的绝对路径是不可以使用的。作者这句话不明白什么意思,不懂这句话和上文有什么关联,一般情况下没人会在web项目中使用绝对路径吧,,如果本地绝对路径上的资源和服务器上保持同步的话应该可以使用吧。
tomcat 部署多个项目的技巧
方法一、在tomcat的根目录下的 conf文件夹下的server.xml文件中的<Host>标签中加入:
//docBase: 项目的webRoot path:访问路径 reloadable:是否每次都重新加载 <Context path="/PD_Microportal" docBase="E:WorkSpacePD_MicroportalWebContent" debug="0" reloadable="false"/>
然而上面对于多个项目的频繁切换就需要注释来注释去的很麻烦有木有!往下看还有更简单的....
方法二、在tomcat的根目录下的 confCatalinalocalhost文件下新建xml文件,文件名就是你项目的的path,可以随意起,就是在浏览器上访问的路径名称。你想同时部署几个工程就创建几个xml 注意文件名别重名。然后把这个:
<Context path="" docBase="E:WorkSpace项目名称WebContent" debug="0" reloadable="false"/>
放到你新建的xml文件中。例如:我有以下三个工程: OA、CRM、ERP,那么就需要有oa.xml、crm.xml、erp.xml。然后再新建一个文件夹tep(名字随意),这个文件夹用来存放不需要部署的项目的xml文件。比如:我现在不想部署OA这个项目,那么直接把oa.xml放到tep文件夹下就ok了,下次想部署了在拿出来就是了,有木有很方便呢!
tomcat配置自己的ROOT项目
当path为空时,访问localhost默认指向docBase指向的项目目录(在tomcat自动解压war包时自动把项目名称改为了ROOT)
<Context path="" docBase="E:WorkSpace项目名称WebContent" debug="0" reloadable="false"/>
或者直接修改项目名字为ROOT,效果同上
我的部署最佳实践
忽略webapps目录和name为localhost的Host标签,直接配置我们自己的Host。
以下可能是通用的配置方案。
一个域名,多个项目的情景:
假如域名为www.domain.com
假如在c盘建立文件夹a和文件夹b,b目录下存放一个名为demo的项目。
注意:文件夹a最好不要放任何项目(避免Context中指定了相同的项目导致项目重复加载),文件夹b下放我们要部署的项目war包或已经解压过的项目。
配置如下:
<Host name="www.domain.com" appBase="c:a" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="c:demo" reloadable="true"/> </Host>
这样一个配置,当启动tomcat时,它首先去Host标签的appBase属性指定的c:a目录下检查是否存在项目,如果是war包则自动解压(解压的目录为当前目录)并加载,如果是目录则直接加载。之后检查Context标签的docBase属性指定的c:demo路径是一个项目目录还是一个war包,如果是一个项目目录那么直接加载,如果是一个war包,那么解压到appBase指定的目录下,再加载。另外注意这里context标签的path属性配置为空,如果demo是个war包的话解压时会以ROOT的去命名解压后的目录(如果path不为空,那么以path指定的字符串去命名)。
配置完成后,浏览器输入www.domain.com将访问到demo这个项目,这是因为path配置是空的。
如果新增了一个项目demo2,那么我们插入一个Context就可以了:
<Host name="www.domain.com" appBase="c:a" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="c:demo" reloadable="true"/> <Context path="demo2" docBase="c:demo2" reloadable="true"/> </Host>
注意path不要重复。
多个域名,多个项目的情景:
我基于上个例子新增了文件夹c和文件夹d:
<Host name="www.domain.com" appBase="c:a" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="c:demo" reloadable="true"/> <Context path="demo2" docBase="c:demo2" reloadable="true"/> </Host> <Host name="www.domain2.com" appBase="c:c" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="c:ddemo" reloadable="true"/> <Context path="demo2" docBase="c:ddemo2" reloadable="true"/> </Host>
这种把项目分开管理的配置很灵活并且避免了项目重复加载的问题(除非你不小心配置了两个相同的项目)。
演示一下为什么会重复加载:
例如c盘下有文件夹p,里面存在项目demo
可能我们的配置如下:
<Host name="www.domain.com" appBase="c:p" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="demo" reloadable="true"/> </Host>
项目的base目录在c盘的p目录,然后配置p目录下的demo为ROOT项目,看起来这么配置好像没什么问题,但启动的时候你会发现,demo这个项目被加载了两次,这是因为Host标签appBase属性指向的目录下的所有项目都会被加载,然后Context标签配置的docBase指定的项目又加载了一次。这就导致了重复加载,只要分开部署就可以解决这种问题了。
我们的服务器目录结构: