大多数情况下我们都是使用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应用。