一针见血tomcat
一、Tomcat各组件认知
1 Tomcat架构说明
Tomcat是一个基于JAVA的WEB容器,其实现了JAVA EE中的 Servlet 与 jsp 规范,与Nginx apache 服务器不同在于一般用于动态请求处理。在架构设计上采用面向组件的方式设计。即整体功能是通过组件的方式拼装完成。
2 Tomcat 各组件及关系
-
Server 和 Service
-
Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务。
-
Connector 连接器
-
HTTP 1.1
-
SSL https
-
AJP( Apache JServ Protocol) apache 私有协议,用于apache 反向代理Tomcat
-
Container
-
Engine 引擎 catalina , (一个)
-
Host 虚拟机 基于域名 分发请求 (多个)
-
Context 隔离各个WEB应用 每个Context的 ClassLoader都是独立 (多个)
-
Component
-
Manager (管理器)
-
logger (日志管理)
-
loader (载入器)
-
pipeline (管道)
-
valve (管道中的阀)
3.Tomcat启动参数说明
我们平时启动Tomcat过程是怎么样的?
-
复制WAR包至Tomcat webapp 目录。
-
执行starut.bat 脚本启动。
-
启动过程中war 包会被自动解压装载。
但是我们在Eclipse 或idea 中启动WEB项目的时候 也是把War包复杂至webapps 目录解压吗?显然不是,其真正做法是在Tomcat程序文件之外创建了一个部署目录,在一般生产环境中也是这么做的 即:Tomcat 程序目录和部署目录分开 。
我们只需要在启动时指定CATALINA_HOME 与 CATALINA_BASE 参数即可实现。
启动参数 |
描述说明 |
JAVA_OPTS |
jvm 启动参数 , 设置内存 编码等 -Xms100m -Xmx200m -Dfile.encoding=UTF-8 |
JAVA_HOME |
指定jdk 目录,如果未设置从java 环境变量当中去找。 |
CATALINA_HOME |
Tomcat 程序根目录 |
CATALINA_BASE |
应用部署目录,默认为$CATALINA_HOME |
CATALINA_OUT |
应用日志输出目录:默认$CATALINA_BASE/log |
CATALINA_TMPDIR |
应用临时目录:默认:$CATALINA_BASE/temp
|
演示自定义启动Tomcat
-
下载并解压Tomcat
-
创建并拷贝应用目录 (conf 文件夹,webapps 文件夹),新建logs
-
编写Tomcat.sh
-
chmod +x tomcat.sh 添加执行权限
-
执行启动测试。
tomcat.sh 内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#!/bin/bash export JAVA_OPTS= "-Xms100m -Xmx200m" # jdk路径 export JAVA_HOME= /usr/local/ding/jdk1 .8.0_191 # tomcat路径 export CATALINA_HOME= /usr/local/ding/apache-tomcat-8 .0.53 # 当前所在路径 export CATALINA_BASE= "`pwd`" case $1 in start) #启动tomcat $CATALINA_HOME /bin/catalina .sh start echo start success!! ;; stop) $CATALINA_HOME /bin/catalina .sh stop echo stop success!! ;; restart) $CATALINA_HOME /bin/catalina .sh stop echo stop success!! sleep 2 $CATALINA_HOME /bin/catalina .sh start echo start success!! ;; version) #查看tomcat当前参数 $CATALINA_HOME /bin/catalina .sh version ;; configtest) #测试tomcat启动是否报错并不真正启动 $CATALINA_HOME /bin/catalina .sh configtest ;; esac exit |
webapps : 存放我们的war包。
conf: 就是tomcat的配置,
sh tomcat.sh start 之后:发现启动成功
即:Tomcat 程序目录和部署目录分开 。
二、Tomcat server.xml 配置详解
Server 的基本基本配置:
元素说明:
server
root元素:server 的顶级配置
主要属性:
port:执行关闭命令的端口号 (该端口可以不写,避免暴露一个端口)
shutdown:关闭命令
service
服务:将多个connector 与一个Engine组合成一个服务,可以配置多个服务。
Connector
连接器:用于接收 指定协议下的连接 并指定给唯一的Engine 进行处理。
主要属性:
-
protocol 监听的协议,默认是http/1.1
-
port 指定服务器端要创建的端口号
-
minThread 服务器启动时创建的处理请求的线程数
-
maxThread 最大可以创建的处理请求的线程数
-
enableLookups 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
-
redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
-
acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
-
connectionTimeout 指定超时的时间数(以毫秒为单位)
-
SSLEnabled 是否开启 sll 验证,在Https 访问时需要开启。
-
可以配置多个Connector
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<Connectorport= "8860" protocol= "org.apache.coyote.http11.Http11NioProtocol" connectionTimeout= "20000" redirectPort= "8862" URIEncoding= "UTF-8" useBodyEncodingForURI= "true" #压缩 compression= "on" compressionMinSize= "2048" #压缩最小值 compressableMimeType= "text/html,text/xml,text/plain,text/javascript,text/css,application/x-json,application/json,application/x-javascript" #压缩文件类型 maxThreads= "1024" minSpareThreads= "200" acceptCount= "800" enableLookups= "false" /> |
Engine
引擎:用于处理连接的执行器,默认的引擎是catalina。一个service 中只能配置一个Engine。
主要属性:name 引擎名称 defaultHost 默认localhost,说一下这个defaultHost,如果从url中的域名或者ip 找不到对应的<host> 的name 那就会使用 defaultHost,defaultHost的值一般是localhost,
Host
虚拟机:基于域名匹配至指定虚拟机。类似于nginx 当中的server,默认的虚拟机是localhost.
主要属性:
-
配置多个Host
appBase是虚拟机的根目录相当于tomcat的webapps。
docBase是你的项目目录,没有以 / 开头的话就是相对于appBase目录下。
说明一下: 当url 是 http://localhost:8080 是就对应第二个的host ,当url 域名是www.likehow.com 是就对应第一个host,
Context
应用上下文:一个host 下可以配置多个Context ,每个Context 都有其独立的classPath。相互隔离,以免造成ClassPath 冲突。
主要属性:
-
演示配置多个Context
<Context docBase="hello" path="/h" reloadable="true"/>
Valve
阀门:可以理解成request 的过滤器,具体配置要基于具体的Valve 接口的子类。以下即为一个访问日志的Valve.
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="www.likehow.com.access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />