一、配置多个域名对应多个项目
之前使用Tomcat配置server.xml的时候只是修改了端口号,其实也只会修改个端口号……
其实我知道这个server文件里有很多非常有用的配置,比如今天想要记录的配置多个host节点,实现多个域名分别对应着多个不同的项目。
<Host name="localhost" appBase="webapps">
<Context path="" docBase="\ROOT" />
</Host>
<Host name="www.mydomain1.com" appBase="webapps">
<Context path="" docBase="WeChat"/>
</Host>
<Host name="www.mydomain2.com" appBase="webapps">
<Context path="" docBase="vote"/>
</Host>
这里用到的两个域名(www.mydomain1.com、www.mydomain2.com)我已经在本地做了dns解析,把域名解析到了本地IP127.0.0.1。经过上面的配置我们已经实现了这样的功能:在浏览器输入www.mydomain1.com访问的是WeChat项目,输入www.mydomain2.com访问的是vote项目。这两个项目都放在Tomcat文件夹下的webapps目录下。
本来以为这样配置就完全没有问题了,但我还是经验太少了,这样配置的结果就是每个项目都会被多次部署。
二、解决项目多次部署问题
本以为项目多次部署没什么问题,但从Tomcat ROOT查看到的内存使用情况来看,多次加载项目还是增加了内存的消耗的,而且这种多次加载的事儿在我这是不允许发生的……
- 原因
Host 节点:
代表一个虚拟主机,每个虚拟主机和某个网络域名(Domain Name)相匹配。每个虚拟主机下都可以部署(deploy)一个或者多个Web 应用程序(Web Application),每个Web 应用程序对应于一个Context,有一个Context path。当虚拟主机获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理。匹配的方法是“最长匹配”,一个path=”“的Context将成为该虚拟主机的默认Context。所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配。host节点的appBase,这个目录表示:
1 这个目录下面的子目录将自动被部署为应用。
2 这个目录下面的.war文件将被自动解压缩并部署为应用
这样造成的结果就是每个host读取项目的时候都会扫描到appBase中的项目并自动部署,
Context节点:
一个Context对应于一个Web应用程序,一个Web应用程序由一个或者多个Servlet组成。
Context 在创建的时候又读取一次项目的文件夹,这一个项目又被部署一次(不知道真实情况是不是这样,目前我是这样理解的)
- 解决
既然造成项目多次部署的原因是多次读取了项目所在的文件夹,那我给他换一个路径存放项目不就行了-_-
<Host appBase="webapps" name="localhost">
<Context docBase="\ROOT" path=""/>
</Host>
<Host appBase="webapps" name="www.mydomain1.com">
<Context docBase="D:\mywebapp\WeChat" path=""/>
</Host>
<Host appBase="webapps" name="www.mydomain2.com">
<Context docBase="D:\mywebapp\vote" path=""/>
</Host>
自己写的项目单独拿出来,放在独立的文件夹下,用绝对路径指到项目地址,这样就不会被多次部署了……
虽然这样解决了问题,但感觉好像有哪里不对啊……