发表于: 2018-02-10 23:48:57
2 769
今日完成:
1. Tomcat 配置文件server.xml
Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat中的一个组件,通过多xml文件中元素的配置,可以实现对Tomcat中各个组件的控制。https://www.cnblogs.com/kismetv/p/7228274.html
Server.xml位于$TOMCAT_HOME/con目录下
基本结构:
<Server> 根元素
<Service> 代表一个Engine元素和一组与之相连的Connector元素
<Connector /> 外部客户端发送请求和接收响应的特定Service的接口;
<Connector />
<Engine> 容器,处理Connector接收的请求,并产生相应的响应,一个Engine可以处理Service的所有请求
<Host> 一个Host组件可以处理发向一个特定虚拟主机的所有请求
<Context /> 一个Context组件可以处理一个特定web应用的所有请求
</Host>
</Engine>
</Service>
</Server>
内嵌组件:可以内嵌到容器中的组件,其他组件都可以归为内嵌组建
1) Server(唯一)
最顶层,代表整个Tomcat容器,唯一
shutdown:关闭Server的指令 port:Server接收shutdown指令的端口号,设为-1表示禁掉端口
作用:提供一个让客户端能够访问Service集合的接口,同时维护内部所有的Service的声明周期(初始化、结束服务、访问服务、、、、)
2) Service(可以多个)
组装Connector和Engine,对外提供服务
一个Service可以包含多个Connector(从客户端接收请求),但是只能包含一个Engine(处理请求)
3) Connector(多个)
接收请求,创造Request和Response对象用于请求端交换数据,分配线程让Engine处理请求,将Request和Response对象传给Engine。
控制Service的协议及端口号
port:规定请求的端口号 protocol:规定请求的协议
redirectPort:当强制要求https而请求http时,重定向到其他Connector
connectionTimeout:链接超时时间
ps:在正式的生产环境中,Tomcat也常常监听8080端口,而不是80端口。这是因为在生产环境中,很少将Tomcat直接对外开放接收请求,而是在Tomcat和客户端之间加一层代理服务器(如nginx),用于请求的转发、负载均衡、处理静态文件等;通过代理服务器访问Tomcat时,是在局域网中,因此一般仍使用8080端口。
ps:AJP协议负责和其他的HTTP服务器(如Apache)建立连接
在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。之所以使用Tomcat和其他服务器集成,是因为Tomcat可以用作Servlet/JSP容器,但是对静态资源的处理速度较慢,不如Apache和IIS等HTTP服务器;因此常常将Tomcat与Apache等集成,前者作Servlet容器,后者处理静态资源,而AJP协议便负责Tomcat和Apache的连接。
4) Engine(唯一)(也就是Servlet容器)
请求处理组件:从多个Cennector接收请求并处理,完成响应返回给Connector(最终到客户端)
name:用于日志和错误信息(唯一)
defaultHost:默认host,当发往本机的请求指定的host名称不存在时进行处理
5) Host(多个)
每个Host组件代表Engine的一个虚拟主机
运行多个Web应用(一个Context代表一个Web应用),负责安装、展开、启动和结束每个Web应用
ps:Host组件代表的虚拟主机,对应了服务器中一个网络名实体(如”www.test.com”,或IP地址”116.25.25.25”);为了使用户可以通过网络名连接Tomcat服务器,这个名字应该在DNS服务器上注册。
客户端通常使用主机名来标识它们希望连接的服务器;该主机名也会包含在HTTP请求头中。Tomcat从HTTP头中提取出主机名,寻找名称匹配的主机。如果没有匹配,请求将发送至默认主机。因此默认主机不需要是在DNS服务器中注册的网络名,因为任何与所有Host名称不匹配的请求,都会路由至默认主机。
name:虚拟主机的主机名(一般情况下,主机名需要是在DNS服务器中注册的网络名,但是Engine指定的defaultHost不需要)
unpackWARs:是否将代表Web应用的WAR文件解压;如果为true,通过解压后的文件结构运行该Web应用,如果为false,直接使用WAR文件运行Web应用。
autoDeploy、appBase、xmlBase、deployOnStartup与Web应用自动部署有关
6) Context(多个)
代表一个Web应用(Web应用基于WAR文件,或者WAR文件解压后对应的应用目录)
Web应用自动部署:(依赖于检查是否有新的或更改过的Web应用)
1.1 Host配置
deployOnStartup和autoDeploy设置为true,则tomcat启动自动部署:当检测到新的Web应用或Web应用的更新时,会触发应用的部署(或重新部署)。
deployOnStartup为true时,Tomcat在启动时检查Web应用,且检测到的所有Web应用视作新应用;autoDeploy为true时,Tomcat在运行时定期检查新的Web应用或Web应用的更新。
appBase和xmlBase设置了检查Web应用更新的目录
appBase属性指定Web应用所在的目录,默认值是webapps,这是一个相对路径,代表Tomcat根目录下webapps文件夹。
xmlBase属性指定Web应用的XML配置文件所在的目录,默认值为conf/<engine_name>/<host_name>,例如主机localhost的xmlBase的默认值是$TOMCAT_HOME/conf/Catalina/localhost/。
1.2 检查Web应用更新
Tomcat按照如下的顺序进行扫描,来检查应用更新:
A、扫描虚拟主机指定的xmlBase下的XML配置文件
B、扫描虚拟主机指定的appBase下的WAR文件
C、扫描虚拟主机指定的appBase下的应用目录
1.3 <Context>元素的配置
Context元素最重要的属性是docBase和path,此外reloadable属性也比较常用。
docBase指定了该Web应用使用的WAR包路径,或应用目录。需要注意的是,在自动部署场景下(配置文件位于xmlBase中),docBase不在appBase目录中,才需要指定;如果docBase指定的WAR包或应用目录就在docBase中,则不需要指定,因为Tomcat会自动扫描appBase中的WAR包和应用目录,指定了反而会造成问题。
path指定了访问该Web应用的上下文路径,当请求到来时,Tomcat根据Web应用的 path属性与URI的匹配程度来选择Web应用处理相应请求。例如,Web应用app1的path属性是”/app1”,Web应用app2的path属性是”/app2”,那么请求/app1/index.html会交由app1来处理;而请求/app2/index.html会交由app2来处理。如果一个Context元素的path属性为””,那么这个Context是虚拟主机的默认Web应用;当请求的uri与所有的path都不匹配时,使用该默认Web应用来处理。
ps:在自动部署场景下(配置文件位于xmlBase中),不能指定path属性,path属性由配置文件的文件名、WAR文件的文件名或应用目录的名称自动推导出来。如扫描Web应用时,发现了xmlBase目录下的app1.xml,或appBase目录下的app1.WAR或app1应用目录,则该Web应用的path属性是”app1”。如果名称不是app1而是ROOT,则该Web应用是虚拟主机默认的Web应用,此时path属性推导为””。
reloadable属性指示tomcat是否在运行时监控在WEB-INF/classes和WEB-INF/lib目录下class文件的改动。如果值为true,那么当class文件改动时,会触发Web应用的重新加载。在开发环境下,reloadable设置为true便于调试;但是在生产环境中设置为true会给服务器带来性能压力,因此reloadable参数的默认值为false。
server.xml中静态部署Web应用:
(静态部署与自动部署是可以共存的)
并不推荐使用静态部署,因为server.xml 是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而自动部署可以在Tomcat运行时通过定期的扫描来实现,不需要重启服务器。
docBase:静态部署时,docBase可以在appBase目录下,也可以不在;本例中,docBase不在appBase目录下。
path:静态部署时,可以显式指定path属性,但是仍然受到了严格的限制:只有当自动部署完全关闭(deployOnStartup和autoDeploy都为false)或docBase不在appBase中时,才可以设置path属性。在本例中,docBase不在appBase中,因此path属性可以设置。
reloadable属性的用法与自动部署时相同。
7) 请求处理
(1) 根据协议和端口号选定Service和Engine
Service中的Connector组件可以接收特定端口的请求,因此,当Tomcat启动时,Service组件就会监听特定的端口。
(2) 根据域名或IP地址选定Host
Service确定后,Tomcat在Service中寻找名称与域名/IP地址匹配的Host处理该请求。如果没有找到,则使用Engine中指定的defaultHost来处理该请求。
(3) 根据URI选定Context/Web应用
Tomcat根据应用的 path属性与URI的匹配程度来选择Web应用处理相应请求
8) 配置多个服务
(1)复制<Service>元素,放在当前<Service>后面。
(2)修改端口号:根据需要监听的端口号修改<Connector>元素的port属性;必须确保该端口没有被其他进程占用,否则Tomcat启动时会报错,而无法通过该端口访问Web应用。
(3)修改Service和Engine的name属性
(4)修改Host的appBase属性(如webapps2)
(5)Web应用仍然使用自动部署
(6)将要部署的Web应用(WAR包或应用目录)拷贝到新的appBase下。
9) Valve
Valve可以与Tomcat的容器(Engine、Host或Context)关联。不同的Valve有不同的特性
AccessLogValve的作用是通过日志记录其所在的容器中处理的所有请求,Valve放在Host下,便可以记录该Host处理的所有请求。AccessLogValve记录的日志就是访问日志,每天的请求会写到一个日志文件里。
(1)className:规定了Valve的类型,是最重要的属性;本例中,通过该属性规定了这是一个AccessLogValve。
(2)directory:指定日志存储的位置,本例中,日志存储在$TOMCAT_HOME/logs目录下。
(3)prefix:指定了日志文件的前缀。
(4)suffix:指定了日志文件的后缀。通过directory、prefix和suffix的配置,在$TOMCAT_HOME/logs目录下
%h:远程主机名或IP地址;如果有nginx等反向代理服务器进行请求分发,该主机名/IP地址代表的是nginx,否则代表的是客户端。后面远程的含义与之类似,不再解释。
%l:远程逻辑用户名,一律是”-”,可以忽略。
%u:授权的远程用户名,如果没有,则是”-”。
%t:访问的时间。
%r:请求的第一行,即请求方法(get/post等)、uri、及协议。
%s:响应状态,200,404等等。
%b:响应的数据量,不包括请求头,如果为0,则是””-。
2. linux常用查看状态
查看指定端口:
侦听状态(LISTEN)已经建立的连接(ESTABLISHED)等待关闭的连接(CLOSE_WAIT)
查看指定应用进程状态(进程id):
查看指定进程下有多少个线程:
查看指定进程侦听的端口
3. Resin4
默认三个端口:
watch dog 用的6600 (配置文件里没有)(resin.xml)
Http端口:8080 (对应app.http)(resin.properties)
Server监听端口: 127.0.0.1:6800 (对应app_servers )(resin.properties)
说明:单个Resin不管同时配置几个应用,每次启动Resin之后,只会启动一个WatchDog监听,kill掉WatchDog后,所有的实例都会停止,WatchDog运行中,kill掉某个实例后,该实例会自动重启。
只要WatchDog在运行中,修改server端口,不需要重启resin。
配置文件:
app-default.xml web应用配置
cluster-default.xml 集群配置
resin.xml
resin.properties 会被修改的变量
resin.xml和resin.properties
resin 4之后把配置文件分成resin.xml和resin.properties两部分.端口/IP修改都在resin.properties文件里面
在resin.xml里面,在resin 实例里面,网站分成: cluster -> server -> host -> web-app 4个层级
access日志(conf/cluster-default.xml):
resin服务器在被访问时,会将访问者的IP、时间、get/set方式、域名后的URL、以及所用的代理记录在logs的access.log文件中。
path: 用于设定日志文件的路径,支持El Variables and Functions,也就是resin中的变量,比如${host.name}就是虚拟站点的id名称,${server.id}则是应用的名字(在一台服务器上开多个应用而又不使用域名的情况下很有用),所以如果将它放在下面的话,将path设置为 logs/${host.name}/access.log的话可以将不同站点的日志存放在不同的目录下面。
rollover-period表示回滚的周期,1D表示以一天为单位回滚,所谓的回滚是将当前所有写日志操作都先锁住,然后将文件的内容复制到文件名带时间戳的文件里,完成之后access.log文件继续使用。如果配置的是1W就表示以一周为单位。
rollover-count表示备份的文件数,这里配置是2,表示最多只备份两个备份文件,超过的就将更早的那个备份文件删除。
rollover-size表示回滚的大小,resin并不是实时都在判断access.log大小有没有超过rollover-size,而是每2分钟检查一次文件,如果在这两分钟之内文件大小超过rollover-size,resin是不做处理的,只有待到两分钟的那一刻,resin才会去将这个大于rollover-size的文件的内容复制到文件名带时间戳的文件里,完成之后access.log文件继续使用。
周期回滚和限制大小回滚可以一起使用
log-handler(resin.xml)
logger(resin.xml)
初始控制台打印内容由conf/resin.xml控制
resin.xml继承cluster-default.xml(集群配置),也就是resin配置的会覆盖cluster-default.xml的相关配置
logger是log-handler的具体解释,此处的两个logger主要用于启动时参数的配置,get第一次访问出现上述打印日志
logger--主要配置 JDK logging API, logger用于指定需要log的包及level(logger对log-handler的进一步解释)
child of <resin>,<server>,<host-default>,<host>,<web-app-default>,<web-app>(可以理解为作用域)
access-log --主要用于http输出
child of <cluster>,<cluster-default>,<server>,<server-default>,<host>,<host-default>,<web-app>,<web-app-default>
stdout-log-用于标准输出(system.out)
child of <resin>,<cluster>,<host-default>,<host>,<web-app-default>,<web-app>
stderr-用于错误输出(system.err)
child of <resin>,<cluster>,<host-default>,<host>,<web-app-default>,<web-app>
一个基本的项目的log配要满足:
日志层级分明(区分log的不同level,正常与异常)
日志错误异常记录
日志存储归类(比如按天存储)
打印请求响应(开发调试阶段)
对于一个容器来讲,还要区分不同的webapp
日志级别:
日志所对应的层
在resin.xml编写日志文件
明日计划:
1. 查看Resin日志,统计访问DB时间,Controller处理时间。
2. 将以上数据都贴到日报里去。 执行时间统计要分成 执行了100次。其中的分布是怎么样的。如20MS有多少次。10MS有多少
遇到的问题:
1. resin日志中com.caucho.sql获得的数据是访问DB的时间吗
2. 计算Controller可以在resin日志中直接读取到,还是需要什么其他方法?没找到解决办法
收获:
1. 解析tomcat配置文件
2. 使用和查看resin日志
评论