大名鼎鼎的应用服务器Tomcat相信所有人都知道,今天来扒开tomcat这层神秘的面纱
首先看看tomcat的架构设计
Server:指Tomcat本身
从上图看,Server是最外层元素,在Service中通过不同的Connector来连接Engine。Engine中包括多个Host,而Host又可以配置多个Context。
1.Server:该元素是server.xml中最重要的元素,他代表了整个JVM,也代表了Tomcat服务器,启动后将在端口8005出等待关闭命令,如果收到“SHUTDOWN”字符串,则关闭服务器
在server.xml代码如下:
<Server port=”8005” shutdown=”SHUTDOWN” debug=”0”>…</Server>
2. Service:该元素包含一个Engine元素以及一个或多个Connector元素。Tomcat安装后Service默认的名称为:Catalina,此外还可以配置一个与Apache联合的Service
在server.xml代码如下:
<Service name=”Catalina”>…</Service>
<Service name=”Apache”>…</Service>
Catalina处理所有直接从Tomcat服务器接收的Web请求
Apache处理所有有Apache服务器转发过来的Web请求
3. Connector:表示客户端和Service之间的链接。Connector的主要功能是接受、响应用户请求。常用的Connector有HTTP/1.1 Connector和AJP Connector,AJP Connector主要使用AJP协议和Web Connector通信,通常用于集群中。
HTTP/1.1 Connector的实例监听在用户配置的端口上,当应用服务器启动时,HTTP/1.1 Connector负责创建若干线程,用于处理用户请求,创建的线程数目取决于用户配置的minThreads值,默认为5,当有更多的用户请求到来时,HTTP/1.1 Connector将会创建更多的线程用于处理请求,创建线程的最大值由maxThreads定义,默认值为20,当所有的线程都在忙于处理用户请求时,新到来的请求将会放入HTTP/1.1 Connector创建的Socket队列中,队列的长度由
acceptCount
属性定义,当等待队列也被占用满了,新来的用户请求将会收到connection refused错误。
3.1.HTTP/1.1 Connector: 会创建处理客户端请求的线程池,下限minProcessors,上限 maxProcessors属性中配置
3.1.1.non-SSL HTTP Connector:非安全的HTTP连接器,能够执行servlet和jsp,监听端口8080
3.1.2.SSL HTTP Connector:安全的HTTP连接器,采用RSA加密,监听端口8443
3.1.3.Prox HTTP Connector:代理HTTP连接器,监听端口8082
3.2.JK 2 Connector:和其他Web Connector通过AJP协议通信。可以将tomcat和apache集成,使用apache处理静态文件,支持均衡负载。
在server.xml代码如下:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Connector常用属性
属性 | 连接器 | 解释 | 默认值 | 必有 |
enableLookups | HTTP,JK | 调用request.getRemoteHost()方法时获取到客户端的机器 | True | 是 |
RedirectPort | HTTP,JK | 如果Connector的配置是支持非SSL的请求,当一个SSL请求到来时,服务器会自动的将请求重定位到redirectPort。 | 8443 | 是 |
acceptCount | HTTP | 等待队列的长度,默认值是10。 | 100 | 否 |
maxThreads | HTTP | 用于处理用户请求的最大线程数 | 20 | 否 |
port | HTTP,JK | 监听端口 | … | 是 |
Debug | HTTP,JK | 输出日志,数字越大,日志越详细 | 0 | 否 |
3. Engine:每个Service只能有一个Engine,处理同一个Service的所有Connector接收到的客户请求。
在server.xml代码如下:
<Engine name="Catalina" defaultHost="localhost">…</Engine>
Engine重要配置属性:
jvmRoute:指定名字是apache认识的唯一表示,使得在集群中他们的的session是共享的
4. Host:一个Engine可以包含多个Host,每个Host代表一个虚拟主机,他包含一个或多个Web应用。
在server.xml 代码如下
<Host name=”localhost” debug=”0” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”>…</Host>
Host常用属性:
appBase:虚拟主机目录,默认为webapps
alias:指定虚拟主机别名,可以指定多个别名
代码如下
<Host name=”localhost”>
…
<Alias>www.mycompany.com</Alias>
<Alias>www.company.com</Alias>
…
</Host>
则可以通过localhost、www.mycompany.com、www.company.com访问该虚拟主机下的Web应用,为了使这个策略生效,所有域名必须在DNS服务器等级,并指向运行Catalina实例的同一个主机
5. Context:表示一个Web应用
Context常用属性:
path:指定访问Web的URL入口,写作”/myweb”,这样的请求url为:http://localhost:8080/myweb/***,默认为””,既可以不需要
docBase:应用程序的路径,可以使绝对路径,默认“ROOT“
6. (嵌套组件)Valve:管道过滤器
a) 访问日志Valve:AccessLogValve
代码如下:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="common " />
主要属性:
Directory:日志保存路径
Prefix:log文件前缀,如access_log.
Suffix:log文件后缀,如.txt
Pattern:日志格式
b) 远端地址过滤器:RemoteAddrValve
将发起请求的客户端的IP地址和一个或多个正则表达式进行比较,以决定或拒绝这个请求
代码如下:
<Context path=”/admin”>
<Valve className=”org.apache.catelina.valves.RemoteAddrValve” allow=”127.0.0.1”/>
</Context>
c) 单次登录Valve:SingleSignOnValve
如果希望用户可以登录到虚拟主机中的任意一个web应用,而且登录以后所有其他的web应用都能使用用户的身份(即不需要重新登录),就可以使用单次登录
8.(嵌套组件)Listener
用于创建一个LifecycleListener对象,监视所在容器的创建和销毁。可以出现在Server、Engine、Host、Context中
代码如下
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
9.(嵌套组件)Cluster
未Host配置集群服务,以提高更高的服务性能,他可以出现在Host元素中、
小结
1. 顶层元素
a) Server
b) Service:包含多个Connector和一个Engine
2. 连接器元素
a) HTTP Connector:Tomcat服务连接器
b) JK Connector:与Apache等外部服务器连接的连接器
3. 容器元素
a) Engine:包含多个Host
b) Host:包含多个Context
c) Context:Web应用配置容器
4. 嵌套组件
a) Logger:为Server、Engine、Host、Context提供日志功能
b) Valve:为Engine、Host、Context提供过滤功能
c) Listener:为Server、Engine、Host、Context提供监听功能
d) Cluster:为Host提供集群功能