总体架构解析
Server: 一个 StandardServer 类实例就表示一个 Server 容器, TOMCAT 启动的时候首先会启动一个 Server, 一个 Server 包括多个 Service
Service: 一个 StandardService 类实例就表示一个 Service 容器, 它由一个或者多个 Connector(连接器), 以及一个 Engine 组成
Connector: 用于接收请求并将请求封装成 Request 和 Response 来具体处理
TOMCAT 有两个典型的 Connector, 一个直接侦听来自 browser 的 http 请求, 一个侦听来自其它 webServer 的请求
Connector Coyote Http/1.1 在端口 8080 处侦听来自客户 browser 的 http 请求
Connector Coyote JK2 在端口 8009 处侦听来自其它 WebServer(Apache)的 servlet/jsp 代理请求.
Engine: 一个 StandardEngine 类实例就表示一个 Engine 容器, 负责处理所有 Connector 所获得的客户请求, Engine 下可以配置多个虚拟主机 Virtual Host, 每个虚拟主机都有一个域名, 当 Engine 获得一个请求时, 它把该请求匹配
到某个 Host 上, 然后把该请求交给该 Host 来处理;
Engine 有一个默认虚拟主机, 当请求无法匹配到任何一个 Host 上的时候, 将交给该默认 Host 来处理
Host: 一个 StandardHost 类实例就表示一个 Host 容器, 代表一个 Virtual Host(虚拟主机), 每个虚拟主机和某个网络域名 Domain Name 相匹配, 每个虚拟主机下都可以部署 (deploy) 一个或者多个 Web App, 每个 Web App 对应于一个 Context, 有一个 Context path, 当 Host 获得一个请求时, 将把该请求匹配到某个 Context 上, 然后把该请求交给该 Context 来处理, 匹配的方法是 "最长匹配"
Context: 一个 StandardContext 类实例就表示一个 Context 容器, 一个 Context 对应于一个 Web Application, 一个 WebApplication 由一个或者多个 Servlet 组成, Context 在创建的时候将根据配置文件 $CATALINA_HOME/conf/Web.xml 和 $WEBAPP_HOME/Web-INF/Web.xml 载入 Servlet 类, 当 Context 获得请求时, 将在自己的映射表 (mapping table) 中寻找相匹配的 Servlet 类. 如果找到, 则执行该类, 获得请求的回应, 并返回.
Wrapper: 一个 StandardWrapper 类实例就表示一个 Wrapper 容器, Wrapper 容器负责管理一个 Servlet, 包括 Servlet 的装载, 初始化, 资源回收. Wrapper 是最底层的容器, 其不能在添加子容器
处理流程
访问请求地址为 http://localhost:8080/examples/composite.jsp 的处理过程:
1, 在端口 8080 启动 Server, 并通知 Service 完成启动, Service 通知 Connector 完成初始化和启动的过程
2,Connector 首先收到这个请求, 会调用 ProtocolHandler 完成 http 协议的解析, 然后交给 SocketProcessor 处理, 解析请求头, 再交给 CoyoteAdapter 解析请求行和请求体, 并把解析信息封装到 Request 和 Response 对象中
3, 把请求 (此时应该是 Request 对象, 这里的 Request 对象已经封装了 Http 请求的信息) 交给 Container 容器
4,Container 容器交给其子容器 --Engine 容器, 并等待 Engine 容器的处理结果
5,Engine 容器匹配其所有的虚拟主机, 这里匹配到 Host
6, 请求被移交给 hostname 为 localhost 的 Host 容器, host 匹配其所有子容器 Context, 这里找到 contextPath 为 / examples 的 Context 容器. 如果匹配不到就把该请求交给路径名为 "" 的 Context 去处理
7, 请求再次被移交给 Context 容器, Context 继续匹配其子容器 Wrapper, 由 Wrapper 容器加载 composite.jsp 对应的 servlet, 这里编译的 servlet 是 basic_002dcomparisons_jsp.class 文件
8,Context 容器根据后缀匹配原则 *.jsp 找到 composite.jsp 编译的 java 类的 class 文件
9,Connector 构建一个 org.apache.catalina.connector.Request 以及 org.apache.catalina.connector.Response 对象, 使用反射调用 Servelt 的 service 方法
10,Context 容器把封装了响应消息的 Response 对象返回给 Host 容器
11,Host 容器把 Response 返回给 Engine 容器
12,Engine 容器返回给 Connector
13,Connetor 容器把 Response 返回给浏览器
14, 浏览器解析 Response 报文, 显示资源内容
tomcat 配置文件 server.xml 解析
- <Server port="8005" shutdown="SHUTDOWN">
- <Service name="Catalina">
- <Executor ...... />
- <Connector ...... />
- <Connector ...... />
- <Engine name="Catalina" ...>
- <Host name="localhost" ...>
- <Context ... />
- </Host>
- </Engine>
- </Service>
- </Server>
1, Connector 节点常用属性
enableLookups:(default=true) 是否允许反向解析访客的 IP 地址, 当你的应用程序使用 request.getRemoteHost() 时如果只需要 IP 地址, 建议禁用此项, 这样能节省反向域名解析的时间.
maxPostSize:(default=2097152 即 2MB) 最大允许 POST 上传的数据大小(单位为: 字节), 对于一般网站来说, 比如有写评论写文章的网站, 默认的 2MB 已经足够, 不过如果网站带有图片甚至文件上传功能, 则需要根据具体情况来定.
protocol: 连接器的类型, tomcat 6 有如下几种选择
org.apache.coyote.http11.Http11Protocol: 简写为 "HTTP/1.1″, 这是默认的连接器, 一个访客网络连接需要一个线程, 并发性能比较低.
org.apache.coyote.http11.Http11NioProtocol:NIO 连接器, 一个由非阻塞的 socket 工作模式构成的连接器, 并发性能良好, 纯 Java 实现.
org.apache.coyote.http11.Http11AprProtocol:APR 连接器, 所谓 APR 就是网络上最多服务器使用的 Web 服务程序 Apache Http Server http://httpd.apache.org/ 所使用的库, Tomcat 建议在生产环境使用, 具体方法下面会介绍.
redirectPort: 当用户访问非 https 的资源而该资源又需要 https 方式访问时, tomcat 会自动重定向到 https 端口, 一般 https 使用 TCP 443 端口, 所以一般取值 "443″.
SSLEnabled:(default=false), 设置当前连接器是否使用安全 SSL 传输, 如果设置为 "true", 则应该同时设置下面两个属性: scheme="https" (default=http) 可以设置为 http 或者 https. secure="true" (default=false).
address: 连接器所绑定的 IP 地址, 当一台服务器存在多个 ip 地址时可以指定其中的需要绑定的一个, 默认不设置该属性的值表示绑定当前服务器的所有 ip 地址.
compressableMimeType:(default="text/html,text/xml,text/plain") 指定需要 GZIP 压缩的资源的类型.
compression:(default=off) 是否启用 GZIP 压缩, 可以取值 on/off/force, 设置为 on 之后会对 compressableMimeType 属性指定的资源类型启用 GZIP 压缩.
connectionTimeout:(default="60000″) 当访客网络连接后, 服务器等待第一行 Request 头出现的时间. 单位是毫秒.
executor: 指定当前连接器使用的线程池的名称, 如果指定, 则忽略其他针对线程数量的设置, 比如 maxThreads.
maxThreads:(default=200) 最多可创建线程的数量.
port="80″: 绑定端口.
keepAliveTimeout:(default=connectionTimeout), 访客完成一次请求后维持网络连接的时间.
2,Executor (定义共享的线程池)节点常用属性
name: 共享线程池的名字. 这是 Connector 为了共享线程池要引用的名字. 该名字必须唯一, 默认值: None
className: 指定实现 org.apache.catalina. Executor 接口的类, 默认值为 org.apache.catalina.core. StandardThreadExecutor
daemon: 是否为守护线程, 默认值为 true
maxIdleTime: 总线程数高于 minSpareThreads 时, 空闲线程的存活时间(单位: ms), 默认值为 60000, 即 1min
maxQueueSize: 任务队列上限, 默认值为 Integer.MAX_VALUE(2147483647), 超过此值, 将拒绝
maxThreads: 线程池内线程数上限, 默认值为 200
minSpareThreads: 线程池内线程数下限, 默认值为 25
namePrefix: 线程名字的前缀. 线程名字通常为 namePrefix+ threadNumber
prestartminSpareThreads: 是否在 Executor 启动时, 就生成 minSpareThreads 个线程. 默认为 false
threadPriority:Executor 内线程的优先级, 默认值为 5(Thread.NORM_PRIORITY)
threadRenewalDelay - 重建线程的时间间隔. 重建线程池内的线程时, 为了避免线程同时重建, 每隔 threadRenewalDelay(单位: ms)重建一个线程. 默认值为 1000, 设置为负则不重建
3,Engine 节点常用属性
name:Engine 的名字
defaultHost: 指定默认 Host.Engine 接收来自 Connector 的请求, 然后将请求传递给 defaultHost,defaultHost 负责处理请求
className: 指定实现 org.apache.catalina. Engine 接口的类, 默认值为 org.apache.catalina.core. StandardEngine
backgroundProcessorDelay:Engine 及其部分子组件 (Host,Context) 调用 backgroundProcessor 方法的时间间隔. backgroundProcessorDelay 为负, 将不调用 backgroundProcessor;backgroundProcessorDelay 的默认值为 10
注: Tomcat 启动后, Engine,Host,Context 会启动一个后台线程, 定期调用 backgroundProcessor 方法. backgroundProcessor 方法主要用于重新加载 Web 应用程序的类文件和资源, 扫描 Session 过期
jvmRoute:Tomcat 集群节点的 id. 部署 Tomcat 集群时会用到该属性,
4,host(虚拟主机)节点常用属性
name: 设置虚拟主机的域名, 比如 localhost 表示本机名称, 实际应用时应该填写具体域名, 当然如果该虚拟主机是给内部人员访问的, 也可以直接填写服务器的 ip 地址, 比如 192.168.1.10.
autoDeploy: 是否允许自动部署, 默认值是 true, 即表示 Tomcat 会自动检测 appBase 目录下面的文件变化从而自动应用到正在运行的 Web 应用程序.
unpackWARs: 设置是否自动展开 war 压缩包再运行 Web 应用程序, 默认值是 true.
appBase: 设置 Web 应用程序组的路径. 前面说过一个虚拟主机可以由多个 Web 应用程序构成, 所以这里的 appBase 所指向的目录应该是准备用于存放这一组 Web 应用程序的目录, 而不是具体某个 Web 应用程序的目录本身(即使该虚拟主机只由一个 Web 应用程序组成).appBase 属性的值可以是相对于 Tomcat 安装目录的相对路径, 也可以是绝对路径, 需要注意的是该路径必须是 Tomcat 有权限访问的.
来源: http://www.bubuko.com/infodetail-2915430.html