在开发的时候都是直接把 war 包直接扔到 tomcat 的 webapps 目录下,通过 localhost:8080/project
来访问,但是在上线系统的部署,显然不可能通过 www.xxx.com/project
这样去访问的。
原来天真的认为域名是可以指向 IP: 端口/project 这样的,今天去客户那部署发现完全不是那么回事,域名只能指向 IP,于是马上求助度娘,找到如下方案。
在 tomcat 的 conf/server.xml
中,默认有个节点是
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host> |
其中 localhost 就是本机的域名,在 hosts 文件中可以看到一句话:
localhost name resolution is handled within DNS itself.
即 localhost 指向的是本机,127.0.0.1 这个 ip 。通过修改和添加 Host 可以增加 tomcat 的虚拟主机,并绑定域名。
这里实验我就放两个 war 包,一个是 admin.war
,对应的域名是 admin.xxx.com
。一个是 sm.war
,对应的域名是 www.xxx.com
在本机做实验的时候,可以通过修改 hosts 文件模拟域名访问。这里我就添加三个域名进去
127.0.0.1 www.xxx.com
127.0.0.1 admin.xxx.com
接下来在 tomcat 中配置虚拟主机
先说明一下两个主机的目录结构
tomcat ├─admin │ └─war ├─sm │ └─war |
稍后解释为什么目录这么建。
在 server.xml 中添加两个虚拟主机
<Host name="www.xxx.com" appBase="sm" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="./war/sm.war" /> </Host> <Host name="admin.xxx.com" appBase="admin" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="./war/admin.war" /> </Host> |
说明一下其中的参数
Host
name 虚拟主机名,一般写域名
appBase 虚拟主机应用的目录
unpackWARs
如果为 true,会解压 war 包,否则不解压,直接运行
autoDeploy 默认为 true,表示如果有新的 WEB 应用放入 appBase 并且 Tomcat 在运行的情况下,自动载入应用。
context
path web 应用名,
docBase web 应用的具体存放路径
path 的作用可以看这位朋友写的 tomcat 原理了解一下:http://blog.csdn.net/xiemk2005/article/details/5988764
配置完成后启动 tomcat,就通过域名访问两个 app 了。
这里有几点要说明的:
刚刚在建立目录的时候为什么要建立 war 目录
在 appBase 中指定的根目录中如果有 war 包,tomcat 就会加载到内存中去,而子目录里的 war 包不会。也可以把 war 包扔到 appBase 意外的其他目录去,Context 的 docBase 里指定就可以了。
为什么不把 war 包都放在 webapps 里
由于我的 path 配置是 「」(空字符串),默认会解压到 ROOT 目录中去,如果都放在 webapps 里,就都会解压到 ROOT
文章评论