在開發的時候都是直接把war包直接扔到tomcat的webapps目錄下,經過localhost:8080/project來訪問,可是在上線系統的部署,顯然不可能經過www.xxx.com/project這樣去訪問的。java
原來天真的認爲域名是能夠指向IP:端口/project這樣的,今天去客戶那部署發現徹底不是那麼回事,域名只能指向IP,因而立刻求助度娘,找到以下方案。web
在tomcat的conf/server.xml中,默認有個節點是tomcat
<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的虛擬主機,並綁定域名。app
這裏實驗我就放兩個war包,一個是admin.war,對應的域名是admin.xxx.com。一個是sm.war,對應的域名是www.xxx.comwebapp
在本機作實驗的時候,能夠經過修改hosts文件模擬域名訪問。這裏我就添加三個域名進去spa
127.0.0.1 www.xxx.com 127.0.0.1 admin.xxx.com
接下來在tomcat中配置虛擬主機.net
先說明一下兩個主機的目錄結構code
tomcat ├─admin │ └─war ├─sm │ └─war
稍後解釋爲何目錄這麼建。orm
在server.xml中添加兩個虛擬主機server
<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