問題解決的配置定位
主要是配置/data/install/apache-tomcat-x.x.x/conf/server.xml文件里的host屬性以及content屬性
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- <Context docBase="cat" path="" reloadable="false" /> --> <!-- 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" /> </Host>
Tomcat里appBase和docBase的區別
首先明確appBase和docBase都是指定tomcat要部署的應用所在的目錄;
appBase配置的目錄(是指定虛擬主機的目錄,可以指定絕對目錄,也可以指定相對於<CATALINA_HOME>的相對目錄.)表示:
- 這個目錄下面的子目錄將自動被部署為應用。
- 這個目錄下面的.war文件將被自動解壓縮並部署為應用
docBase只是指向了你某個應用的目錄(指定Web應用的文件路徑.可以給定絕對路徑,也可以給定相對於Host的appBase屬性的相對路徑)
總結:
- 如果你想自己指定路徑,那么應該在docBase里面
- 如果你想簡單,那么直接把他們復制到appBase下面就行了
- appBase目錄只能包含應用,是應用的父級目錄,而不能是一個應用目錄;如果不配置Context指定應用docBase和path,則下屬應用的docBase就是該應用名稱,path就是 “/應用名”;
- docBase目錄應用所在路徑,可以是磁盤絕對路徑,也可以是相對appBase路徑,如果配置相對路徑,則應用部署兩次
示例1
比如你的應用為myApp, 放在了d:\project\myApp,里面有2個子目錄d:\project\myApp\images和d:\project\myApp\js
你可以通過
- 設置 appBase 指向 d:\project 來讓系統自動部署
- 你可以手工指定docBase到 d:\project\myApp
- 如果你指定了 appBase到 d:\project\myApp 那么d:\project\myApp\images這個將不再是普通的子目錄,而是一個單獨的虛擬目錄,或者叫應用了。因為其被自動部署;d:\project\myApp\js 也一樣的后果
示例2
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="ture" > <Context path="" docBase="aaa" debug="0" reloadable="true"/> </Host>
結果就是項目加載部署了兩遍
第一遍:webapp下所有的文件夾部署(雖然我只有一個aaa文件夾)(訪問路徑 localhost:8080/aaa/.....)
第二遍:指定docBase為aaa文件夾又走了一遍,且path為空(l訪問路徑 localhost:8080/......)
這兩個域名都能走!!!
<CATALINA_HOME>的webapps目錄下ROOT目錄和其他應用目錄
在tomcat配置文件目錄conf目錄下的server.xml中添加<Context>元素,配置如下:
<Context docBase="app" path="" reloadable="false" />
在<Context>配置中包含如下信息:
- 配置docBase值為:docBase="app"或者docBase="app.war",即項目war包名稱或者全名;
- path為空,表示app為tomcat默認應用;
同時,將app.war部署在${CATALINA_HOME}/webapps/路徑下。
實際上,tomcat部署應用程序的順序是這樣的(tomcat啟動日志):
1.最先部署${CATALINA_HOME}/webapps/路徑下的ROOT應用,該應用為tomcat的默認應用程序,訪問時不用帶應用上下文路徑,即:http://host:port/xxx。
2.然后再按照字母順序升序依次部署其他應用程序,如:appA,appB等等。
說明:
- 當webapps路徑下沒有ROOT目錄
如果在部署app時刪除了${CATALINA_HOME}/webapps/路徑下的ROOT目錄(即刪除tomcat默認應用),
那么在tomcat啟動時,會首先在CATALINA_HOME/webapps/路徑下創建名稱為ROOT的目錄,然后將文件app.war中的內容拷貝到ROOT目錄下,開始部署ROOT應用程序。
接下來才會解壓app.war,再部署app應用。
從tomcat的啟動日志可以很容易知道,在這種情況下app應用會被加載2次,一次是部署ROOT時加載的,另一次是部署app本身加載的。
因此,訪問應用可以帶應用上下文路徑,也可以不用帶上下文路徑,即:http://host:port/xxx或者http://host:port/app/xxx。
- 當webapps路徑下存在ROOT目錄
如果在部署app時不刪除${CATALINA_HOME}/webapps/路徑下的ROOT目錄,即已經存在默認應用程序。
此時在tomcat啟動時,會先部署ROOT默認應用(注意:已經存在ROOT應用,不再會拷貝app.war文件內容到ROOT下)。然后解壓app.war,部署app應用。顯然,app應用只被部署一次!
因此,在這種情況下,即便配置了<Context>元素的path為空,但是訪問app應用時還是必須攜帶應用上下文路徑,即:http://host:port/app/xxx。
多個應用,指定了多個Context,那就必須都配上path
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false" deployOnStartup="false"> <Context path="aaa" docBase="testa" debug="0" reloadable="true"/> <Context path="bbb" docBase="testb" debug="0" reloadable="true"/> </Host>
有多個context,就要配上多個path,這樣才能根據不同的項目走不通的路徑
也就是說
testa應用走的是localhost:8080/aaa/...
testb應用走的是localost:8080/bbb/...