大多數情況下我們都是使用Tomcat開發web應用,所以,我們需要對Tomcat的配置有一定的瞭解,如端口配置、應用根目錄、多Tomcat配置時需要更改哪些端口等。
下載解壓Tomcat後,打開/conf/serve.xml,我們一般都能看到一下內容:
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
問題1:修改默認端口(8080)
<!-- 將8080端口改爲8888 -->
<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
問題2:如何自定義虛擬目錄
<!-- 方法1:將虛擬目錄改爲D盤的projects目錄下,webapps目錄下的應用不再可用-->
<Host name="localhost" appBase="D:\projects"
unpackWARs="true" autoDeploy="true">
<!-- webapps和D盤projects目錄下的應用都可用 -->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- 不要忽略path屬性 -->
<Context path="/" docBase="D:\projects"/>
</Host>
這裏可能會涉及到一個資源重複的問題,到最後講。。。。
問題3:同一個機器部署多個Tomcat的問題
同一臺機器部署多個Tomcat可能會引起端口占用的問題,所以部署多個Tomcat需要修改三個端口,分別是兩個Connector.port和一個Server.port
<!-- 將默認的8005改爲8006 -->
<Server port="8006" shutdown="SHUTDOWN">
<!-- 將默認的8080改爲8081-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- 將默認的8009改爲8010-->
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
<!-- 省略其他部分 -->
</Server>
問題4:我希望使用指定的域名訪問我的應用而不是localhost
第一步:
<!-- 將localhost改爲你想要的域名,例如www.hxl.com -->
<Host name="www.hxl.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
第二步:
打開C:\Windows\System32\drivers\etc\hosts文件,添加下面一行即可
127.0.0.1 www.hxl.com
說明,當我們瀏覽器去請求帶有域名的url時,例如www.baidu.com/xxx,瀏覽器會依次執行下面的操作
1、查找本地hosts文件是否配置www.baidu.com映射的IP信息,找到則跳到第四步,否則執行下一步
2、查找路由器DNS配置信息,找到則跳到第四步,否則執行下一步
3、去互聯網DNS服務器上查找IP,如果還找不到,則返回404找不到資源
4、根據IP和端口信息查找相應的資源信息,如果域名沒有顯式地標明使用哪個端口,則使用的是80端口
現在,我們回到第二點:
<!-- webapps和D盤projects目錄下的應用都可用 -->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- 不要忽略path屬性 -->
<Context path="/" docBase="D:\projects"/>
</Host>
如果webapps和D:\projects都存在名爲myweb的應用,那麼我訪問localhost:8080/myweb/xxx的時候,會去請求哪個目錄下的web應用?結論是只會請求webapps下的web應用。
但是,如果webapps和D:\projects都存在一個靜態資源文件,如index.jsp,當請求localhost:8080/index.jsp時,會優先請求D:\projects的靜態文件。
如果配置的是
<Context path="/myweb" docBase="D:\projects"/>
那麼,webapps下的myweb應用將失效。
以上結論都基於tomcat-8.5.15測試得到的結論,當然,一般情況下,我們都不會做一些有歧義的配置信息,而且,一個tomcat一般只會部署一個web應用。