tomcat配置文件目录是conf目录,主要配置文件有5个,下面一个个分析下。
Context.xml是Tomcat公用的环境配置,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。不同于server.xml 文件是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。
//监听web.xml文件,文件变动后重新加载
WEB-INF/web.xml
${catalina.base}/conf/web.xml
我们web应用的默认配置文件。比如:
默认Servlet
default
org.apache.catalina.servlets.DefaultServlet
debug
0
listings
false
1
默认JSPServlet
jsp
org.apache.jasper.servlet.JspServlet
fork
false
xpoweredBy
false
3
Servlet可以处理的请求
default
/
jsp
*.jsp
*.jspx
可以处理的请求类型,只要只贴出部分我们常见的请求类型
json application/json jsonml application/jsonml+json jspf text/plain这个是tomcat自动的应用管理工具Tomcat Manager访问的用户权限配置。
tomcat内部的分为哪几个角色,每个角色可以访问什么资源,这些在哪里看?
在tomcat目录下的webapps\manager\WEB-INF目录下面的web.xml文件。这个就是tomcat自动管理应用的web.xml文件。
其中有security-role节点,定义了有哪些角色
The role that is required to access the HTML Manager pages
manager-gui
The role that is required to access the text Manager pages
manager-script
The role that is required to access the HTML JMX Proxy
manager-jmx
The role that is required to access to the Manager Status pages
manager-status
还有个security-constraint节点定义了每个角色可以访问什么资源
HTML Manager interface (for humans)
/html/*
manager-gui
Text Manager interface (for scripts)
/text/*
manager-script
JMX Proxy interface
/jmxproxy/*
manager-jmx
Status interface
/status/*
manager-gui
manager-script
manager-jmx
manager-status
这个配置文件集成第三方JASPIC身份验证,我们不常用,这里不分析。
server.xml是tomcat的核心配置文件。先大致看一眼,再分析。
//server是顶层元素,只能有一个
//监听器
// 全局命名资源,来定义一些外部访问资源
//service将Connector和Engine包装起来,统一对外提供服务。一个server可以有不同的service
//不同的service监听不同的端口
//线程池
//Connector监听端口为8080,处理协议HTTP1.1协议
//创建Request和Response对象,然后分配线程让Engine来处理这个请求
//处理Connector发送的请求,并把相应返回给Connector
//虚拟节点,处理对应域名或者ip的请求
//日志打印
整个配置文件的根元素,代表整个tomcat容器,一个tomcat中只能有一个server元素。Server的作用就是提供一个接口,让客户端能够访问内部Service集合,同时维护所有的Service的生命周期,包括初始化、结束服务以及如何找到客户端要访问的Service。
属性:
Listener就是监听器,监听特定事件发生并执行特定的操作。监听器可以在Server、Engine、Host或Context中。
属性:
介绍几个常用监听器:
service就是将其内部的Connector和Engine包装起来,统一对外提供服务。一个Service可以包含多个Connector,但是只能包含一个Engine。其中Connector的作用是从客户端接收请求,然后转交给Engine处理,Engine处理完成后将响应返回给Connector,Connector再返回给客户端。
Connector就是连接器。作用是接收客户端的连接请求,创建Request和Response对象,然后分配线程让Engine来处理,并把产生的Request和Response对象传给Engine。Engine处理完后将Response返回给Connector,Connector再返回给客户端。
属性:
//处理以http协议访问8080端口的请求,当要求请求是https,但请求是http时,重定向到端口号为8443的Connector
//处理以AJP协议访问8009端口的请求。AJP协议负责和其他的HTTP服务器(如Apache)建立连接。
//Tomcat常用来作为Servlet/JSP容器,但是对静态资源的处理速度较慢,不如Apache等HTTP服务器,所以有时会将Tomcat和Apache集成,这时候就会用到这个连接器。
(2)Connector重要参数详细说明
Connector是处理客户端连接请求的,分配线程让Engine处理,所以Connector参数的配置直接影响tomcat的性能,这里详细说明下几个重要的参数。
Connector处理请求分为BIO和NIO两种方式。
BiO的处理流程:
客户端通过TCP三次握手和服务器建立连接后,连接请求socket会放入一个accept队列。Connector中主要通过JIoEndpoint对象处理请求,JIoEndpoint对象维护了Acceptor和Worker。Acceptor负责从accept队列接收socket,然后从Worker线程池中找出空闲的线程处理socket。如果没有空闲线程,Acceptor将阻塞。其中如果配置了Executor,使用的是Worker线程池就是Executor,否则是tomcat自带的线程池。
NiO的处理流程:
客户端通过TCP三次握手和服务器建立连接后,连接请求socket会放入一个accept队列。Connector中主要通过NIoEndpoint对象处理请求,NIoEndpoint对象维护了Acceptor、Worker和Poller。Acceptor负责从accept队列接收socket,然后Acceptor将请求放入了一个队列,Poller从队列中消费请求,并将该请求注册到一个Selector选择器,然后轮询Selector找到真正有请求数据的,再从Worker线程池中找出空闲的线程处理socket。如果没有空闲线程则将阻塞。其中如果配置了Executor,使用的是Worker线程池就是Executor,否则是tomcat自带的线程池。
目前大多数HTTP请求使用的是长连接,也就是说socket在当前请求结束后,socket不会立马释放,而是等timeout后再释放,相应的线程会一直被占用。使用BIO,有socket连接后直接交给线程处理,不管有没有读写请求,所以Tomcat同时处理的socket数目不能超过最大线程数,性能受到限制。而使用NIO,socket是注册到Selector选择器,有读写请求后才交给线程处理,所以Tomcat可以同时处理的socket数目可以远大于最大线程数,并发性能大大提高。
acceptCount、maxConnections、maxThreads参数
Executor的主要属性包括
Engine在Service中只能由一个;Engine是Service组件中的请求处理组件。Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector。
Engine、Host和Context都是容器,Engine包含Host,Host包含Context。Engine中至少有一个Host元素,并且必须有一个Host属性的名字与defaultHost指定的名字相匹配。
属性:
Host表示一个虚拟主机。
属性:
autoDeploy和deployOnStartup区别
Context代表在特定虚拟主机上运行的一个WEB应用程序,需处理当前WEB应用程序的所有请求,每一个ontext必须使用唯一的上下文路径。
Context是Host的子容器,每个Host中可以定义任意多的Context元素。
属性:
有时候我们的server.xml配置文件中并没有Context元素。这是因为Tomcat开启了自动部署,这时候path属性由配置文件(xmlBase目录下xml文件)的文件名、WAR文件的文件名或应用目录的名称自动推导出来。如果名称是ROOT,则该Web应用是虚拟主机默认的Web应用,此时path属性推导为""。
Valvee在Tomcat中代表了请求处理流水线上的一个组件,Valve可以与Tomcat的容器Engine、Host或Context关联。不同的Valve有不同的特性,这里介绍一下上面出现的AccessLogValve。
AccessLogValve的作用是通过日志记录其所在的容器中处理的所有请求,在上述文件中Valve放在Host下,可以记录该Host处理的所有请求。
AccessLogValve的属性
先看下tomcat的架构图
tomcat中只能由一个server,一个server中可以包含多个service,一个service中只能包含一个Engine,可以包含多个Connector,一个Engine可以包含多个host,一个host中可以包含多个Context。
tomcat处理流程: