前文我们聊了下tomcat的配置文件相关格式和组件简介以及webapp目录结构,manger部署和host managera部署,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13307892.html;今天我们来详细聊一聊server.xml中的各组件配置和属性;
server:在tomcat中,一个server就代表一个tomcat实例;所谓tomcat实例就是在服务器上表现为一个Java进程,默认监听在8005端口,该套接字默认只接收"SHUTDOWN"来关闭tomcat实例;因此,在同一物理主机上启动多个tomcat实例时,需要修改其监听端口为不同其他tomcat实例所监听的端口;
示例:修改server默认用于关闭tomcat实例的命令
默认配置
使用默认配置关闭tomcat实例
提示:可以看到当我们使用telent去连接8005端口,然后给它发送一个SHUTDOWN命令就可以实现关闭tomcat实例;
更改关闭tomcat实例命令为SHUTDOWN-TOMCAT
提示:以上配置表示使用SHUTDOWN-TOMCAT命令来关闭tomcat实例
测试:重启tomcat服务,然后用原来的SHUTDOWN命令看看是否可以关闭tomcat实例呢?
提示:可以看到现在我们使用shutdown命令就不能把tomcat实例关闭掉了;
测试:用SHUTDOWN-TOMCAT命令是否可关闭tomcat实例呢?
提示:我们使用SHUTDOWN-TOMCAT命令就可以实现关闭tomcat实例;这里建议把这个关闭实例的命令修改成其他不容器被猜到的命令,这样相对要安全点;
Service:用于实现将一个或多个connector组件关联至一个engine组件;
提示:以上配置上默认配置,默认service名称叫catalina ,它关联了一个connector 端口为8080 ,协议是http/1.1,连接超时时长为20秒,如果启用了https,访问对应资源如果必须是https,它默认会跳转至8443端口;其实service的属性就 一个name,这个没有什么好说的,默认情况我们都不会去更改service的名称,用默认的catalina就行;
Connector连接器组件:主要作用负责接收请求,常见的连接器有三种,分别是http连接器,https连接器,和ajp连接器;进入tomcat的请求可分为两类,一类是来自客户端浏览器的访问,一类是来自其他web server反代访问;如果想配置tomcat只能通过代理来访问,并且不能绕过代理来访问,我们可以选择把http和https连接器给禁用了,只留一个ajp连接器,这样一来tomcat就只能通过httpd的ajp反代来访问,因为浏览器不支持ajp协议;
Connector组件的属性有:port用于指定连接器监听的端口,如果只指定监听端口没有指定ip地址,表示监听本机所有可用地址的对应端口;protocol用于指定用于连接该连接器所用到的协议;connectionTimeout用于指定连接该连接器的超时时长;address用于指定监听的ip地址,不指定默认是本机所有可用地址;maxThreads用于指定该连接器的最大连接数,不指定默认为200;enableLookups用于指定是否启用DNS查询功能,如果开启了此功能,每次访问它都会把对应IP地址反接成主机名,其实这个是很消耗访问时间的,所以通常情况下都是把这个属性关闭的;acceptCount用于指定等待连接队列的长度,如果链接队列已经满载了,这个属性就是来指定后面排队的长度;redirectPort用于指定重定向端口,假如我们访问一个资源,而该资源又限定必须通过https协议访问,此时我们用http连接器访问该资源,它会跳转至对应端口的连接器上;sslProtocol用于指定ssl协议;URIEnconding用于指定uri的字符集,这个在有些uri是中文的场景中需要指定;
示例:添加一个连接器,监听本机127.0.0.1:9090 使用协议为http1.1
提示:以上配置标签名称区分大小写,里面的属性不区分大小;通常建议还是区分大小写去配置;tomcat的配置文件都遵循Java变量命名规范,都是驼峰式命名;
测试:重启tomcat服务,看看127.0.0.1:9090是否处于监听状态?
提示:可以看到127.0.0.1:9090已经处于监听状态;
Engine组件:主要作用实例化一个Servlet实例,用于运行servlet代码,其内部可以一个或多个host组件来定义站点;如果有多个虚拟主机通常需要通过defaultHost属性来定义默认的虚拟主机;这里的虚拟主机和httpd里的虚拟主机概念没有本质不同;engine的常用属性有:name用于指定引擎的名称;通常engine的名称为catalina不会去改变,这是因为tomcat内建代码中相关引擎的名称为catalina;defaulthost用于指定默认虚拟主机;jvmroute用于指定tomcat集群jvm标识,意思是多个tomcat实例组成的集群,对应请求路由该发往那个引擎上,就是靠jvmroute来指定;这个有点类似ipvs中给报文打标记的意思;通常用于tomcat集群基于cookie的会话绑定或sessions stick中使用;
Host组件:位于engine内部用于接收请求并进行相应处理的主机或虚拟主机;常用的属性有:name用于指定host的名称;appBase用于指定此Host的webapps的默认存放目录,指存放非归档的web应用程序的目录或归档的WAR文件目录路径;可以使用基于$CATALINA_BASE变量所定义的路径的相对路径;uppackwars用于指定是否将.war格式的包展开;autodeploy用于指定是否支持自动部署(在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至tomcat);
示例:添加一个虚拟主机,名为www.test1.com ,对应网页目录根文件路径为/appdata/test 支持展开.war包,支持自动部署
更改配置文件,新增一个host
提示:注意appBase必须区分大小写,否则配置不会生效;
新建host所指定的目录和目录结构
提示:这里新建的虚拟主机就相当于访问对应虚拟主机名称,然后就返回一个页面;访问的URL中是除了虚拟主机名称就没有别的uri了;所以我们需要在指定目录下新建一个ROOT的目录;
新建一个测试页
重启服务,访问我们新建的虚拟主机,看看是否能够访问到我们提供的测试页面?
用浏览器访问新建的虚拟主机,看看是否访问到我们提供的测试页面?
提示:可以看到我们访问www.test1.com 是可以正常访问到我们提供的测试页面,这意味着我们配置的虚拟主机生效了;
Context组件:该组件主要作用是用于定义url路径和网页文件路径的对应关系;有点类似nginx里的alias指令
示例:把/helloapp/helloword 部署到www.test1.com虚拟主机上,并可以通过www.test1.com:8080/helloword访问到
创建目录结构,并准备测试网页
提供测试页面
修改配置文件,新增context 把/helloapp/helloword 部署到www.test1.com上 并实现访问www.test1.com:8080/helloword
提示:以上配置表示访问www.test1.com/helloword 对应页面文件存放在/helloapp/helloword/下;context组件中path用于指定uri的路径;docBase用于指定网页目录;
重启tomcat,访问www.test1.com:8080/helloword看看是否访问到我们提供的测试页面?
提示:我们提供的测试页面能够被访问到;
Valve组件:该组件根据不同类的实例不同,其作用也不同;常用于定义日志,访问控制;
示例:给www.test1.com定义一个访问日志
提示:Valve组件中className 用于指定类,不同类对于Valve有着不同的意义,也决定了valve的作用;valve相关使用说明请参考官方文档https://tomcat.apache.org/tomcat-7.0-doc/config/valve.html;directory用于指定存放日志的目录,如果使用相对路径则相对CATALINA_BASE所指定的位置;prefix用于指定日志文件前缀名称;suffix用于指定日志文件后缀名称;中间部分通常是年月日时间用中横线连接的字串;pattern用于指定日志格式;有关日志格式的宏定义相关说明请查看官方文档https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/AccessLogValve.html;这里需要说明一下,"表示一个双引号,如果pattern中间有双引号,请使用"去表示;
重启tomcat,访问www.test1.com 看看是否有日志生成
提示:重启tomcat后,在对应目录就可以看到有我们刚才定义的日志文件;
测试:访问www.test1.com 看看是否在记录日志到对应日志文件中?
示例:定义只允许192.168.0.21访问www.test1.com
提示:以上配置表示只允许192.168.0.21这台主机访问www.test1.com这台虚拟主机所提供的内容,其他主机都无法访问,包括本机;
测试:重启tomcat,在ip为192.168.0.21上访问www.test1.com看看是否可访问?
测试:在非192.168.0.232的主机上访问看看是否可访问?
提示:可以看到在非192.168.0.21上访问提示为权限拒绝,是不能访问www.test1.com这台虚拟主机所提供的页面的;当然上面的配置使用allow来指定只允许的IP地址,这种是白名单机制;如果使用deny去指定,表示拒绝指定的IP访问,开放未指定的IP访问,这就是黑名单机制;