深入Tomcat之 通过配置server.xml可以实现的功能
本章主要从以下几个问题入手解决
-
修改tomcat默认端号
-
配置虚拟目录
2.1 拓展热加载 和热部署 -
多域名登陆解决
3.1 拓展 windos本地临时域名配置 -
配置虚拟主机
问题一 修改端口
实际用户在浏览器中访问网网站,只需要域名或ip就可实现访问,并未输入端口号,我们只需要把tomcat默认的端口8080,该为http默认端口80,便可实现。
<Connector port="80" useBodyEncodingForURI="true" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
但要特别注意,在eclipse中,tomcat中Overview界面也可对port修改,且从这修改后的结果会写到Server.xml文件中;
有种情况特殊,注意下,当你修改xml中的port号,比如从8080改为80,而此时你又通过Overview界面修改了了其它东西,在运行tomcat时,会触发系统按照overview中的信息去配置tomcat,但Overview界面中的port还是8080,这时又给你xml文件改成8080了。
哎,每个坑都是用泪添满的啊,这个坑让在里面潜伏了一个下午
问题二 配置虚拟目录
试想一下,我们有很多个项目,而且项目内存较大,把这些项目都放在webapps ,可能会造成这个文件过大,(好像很有道理,但我自己目前没感觉到会造成多大的问题),总之,基于这样的考量,我们就可以在一个host标签下,配置多个Context标签。
host标签主要有4个属性,
①appBase指定把什么文件夹作为作为项目的默认的文件,基本上多为webapps
(在有些版本eclipse建的动态web项目,叫 webContent
,虽然tomcat中配置了appBase为webapps,但好像也不影响使用 )
eclipse Phtoton版本如下
②autoDeploy 设置 为ture 表示自动部署 ,也称为热部署
热部署 : 当项目发生变动的时候,在运行的情况下重新部署项目,这个就是常说的热部署,从Tomcat 6开始热部署不再会丢失session了。 这里注意一下,有时候会发现保存了以后,正在运行的项目并没有发生变化,这是因为build workspace并没有完成,这时只要重新保存一下就可以了,用eclipse的保存后留意一下右下角的building workspace是否100%了。
但是修改xml配置文件,是一定要重启tomcat的;
同时,也要注意添加新的类,或者变动方法标签,热加载是否有效(笔者在写博文当下暂未有结论);
如果想要实现高效的热部署,可以借肋外部插件 JRebel (笔者当下暂未试过)
可参考博文 2017年最新JRebel+Eclipse热部署教程
③name 可以理解就是填写域名的地方
④unpackWARs 设置为ture 表示如果是war包,是否自动解压
Context标签主要属性
① doBase 是项目的本机的物理路径,是项目真实的路径
② path 是项目在浏览器中的访问路径,是虚拟的路径
但要注意,相同name属性相同的host标签下,有多个context标签时,它们的path不能相同,不然都长的一样,怎么去识别呢
我们也可以设置path="/",表示我们在浏览器中不需要输入路径,就可以查看服务器下的文件 比如 localhost:8080/hello.html 中间就省略了项目访问路径,但这种也只适用于读取一些静态的文件
③reloadable 设置为true就是经常说的热加载
热加载: 当项目发生改动的时候,会重新编译修改的类。也就是常说的热加载。注意,热加载的特征内存不会清空,sessin不会丢失,但容易造成内存溢出,或者找不到方法(这是因为重新编译的过程);这就是为什么开启热加载后修改了java代码,一保存项目就报错的原因了。
<Host appBase="webapps" autoDeploy="true" name="www.51ol.com" unpackWARs="true">
<!--Host标签可以设置多个,方便多域名配置-->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
<!--docBase为项目真实路径 path表示项目通过浏览器访问路径,-->
<Context docBase="E:\tomcat\apache-tomcat-8.0.45\wtpwebapps\tt" path="/tt" reloadable="true"/>
<Context docBase="F:cd\cs" path="/cs" reloadable="true"/>
</Host>
但是同时,要实现动态Web的效果,自定义的文件夹应该有WEB-INF,和它里面的web.xml,文件(下图中未能展示出WEB-INF中的xml文件)
问题三 :多域名访问
我们想通过多个域名来访问同一个资源,是通过修改标签name属性实现 ,而且标签可以有多个;
<Host appBase="webapps" autoDeploy="true" name="www.51ol.com" unpackWARs="true">
<!--Host标签可以设置多个,方便多域名配置-->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
<!--docBase为项目真实路径 path表示项目通过浏览器访问路径,-->
<Context docBase="E:\tomcat\apache-tomcat-8.0.45\wtpwebapps\tt" path="/tt" reloadable="true" source="org.eclipse.jst.jee.server:tt"/>
</Host>
<Host appBase="webapps" autoDeploy="true" name="www.ol51.com" unpackWARs="true">
<!--Host标签可以设置多个,方便多域名配置-->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
<Context docBase="E:\tomcat\apache-tomcat-8.0.45\wtpwebapps\tt" path="/tt" reloadable="true" source="org.eclipse.jst.jee.server:tt"/>
</Host>
上面的是俩个标签,分别设置了俩个域名,www.51ol.com www.ol51.com
但俩个标签中的标签相同
特别说明: 这个域名一个要真实存在;且一定要解析到你的IP才能用。
当然,也有一个办法,可以配置临时域名
在Windwos环境下,
1)、打开到 C:\Windows\System32\drivers\etc 下,找到 hosts 文件
2)、在 hosts 文件下配置临时域名
在文件中新起一行,输入
127.0.0.1 www.51ol.com
127.0.0.1 www.51ol.com
就可以在本地用“假”的域名访问了
问题四 :配置虚拟主机
配置虚拟主机其实就是我们想在只开启一台tomcat,让多个域名可以访问同访问不同资源(不同网站);
和配置多域名登陆基本思路相同,通过填加多个host标签来实现,不同的是:
多域名访问是不同host标签的有相同的name属性(相同域名),访问同一资源(就是contxt标签 docBase属性相同);
而虚拟主机的需求是不同host标签有不同的name属性(不同域名),访问不同资源(就是contxt标签 docBase属性不相同);
Code
<Host appBase="webapps" autoDeploy="true" name="www.51ol.com" unpackWARs="true">
<!--Host标签可以设置多个,方便多域名配置-->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
<!--docBase为项目真实路径 path表示项目通过浏览器访问路径,-->
<Context docBase="E:\tomcat\apache-tomcat-8.0.45\wtpwebapps\tt" path="/tt" reloadable="true" source="org.eclipse.jst.jee.server:tt"/>
</Host>
<Host appBase="webapps" autoDeploy="true" name="www.ol51.com" unpackWARs="true">
<!--Host标签可以设置多个,方便多域名配置-->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
<Context docBase="F:cd\cs" path="/cs" reloadable="true"/>
</Host>
End!